全局字典我有以下的應用程序,運行一個調度程序,以週期性地更新全局變量的狀態(字典):更新從多個線程
from sanic import Sanic
from sanic.response import text
from apscheduler.schedulers.background import BackgroundScheduler
import bumper
app = Sanic()
scheduler = BackgroundScheduler()
inventory = {1: 1, 2: 2}
@scheduler.scheduled_job('interval', seconds=5)
def bump():
bumper.bump()
@scheduler.scheduled_job('interval', seconds=10)
def manual_bump():
global inventory
inventory[2] += 1
@app.route("/")
async def test(request):
return text(inventory)
if __name__ == "__main__":
scheduler.start()
app.run(host="0.0.0.0", port=8000)
在5秒的時間間隔工作導入的功能被在同一目錄中的不同文件中:
from app import inventory
def bump_inventory():
inventory[1] += 1
print('new', inventory)
但是,這並不像我希望的那樣工作。導入的函數會更新庫存,但是更改絕不會傳播到原始字典,因此bump_inventory
正在處理inventory
的副本,或者它從不在函數作用域之外進行更新。在兩個不同的終端:
]$ python app.py
2017-02-19 14:11:45,643: INFO: Goin' Fast @ http://0.0.0.0:8000
2017-02-19 14:11:45,644: INFO: Starting worker [26053]
new {1: 2, 2: 2}
new {1: 3, 2: 2}
]$ while true; do curl http://0.0.0.0:8000/; echo; sleep 1; done
{1: 1, 2: 2}
...
{1: 1, 2: 3}
...
這樣做的正確方法是什麼?
謝謝!我對asyncio的東西還比較陌生,所以這是非常有用的信息。我希望擁有全局狀態的原因是不要打擾數據庫並將所有內容都放在內存中。內存中的SQLite數據庫也是一個選項,但是清單中的數據非常簡單(對於簡單的線程安全字典而言是完美的),所以它看起來像是過度殺傷。在'app'中保持全局狀態而不是一個單獨的變量的優點是什麼? – mart1n
另外,任何包含'add_task'的版本在PyPI中都可用? – mart1n