Я работаю над приложением Python, где я запускаю цикл событий Asyncio в отдельном потоке. Мне нужно поделиться состоянием (например, изменчивым словарем) между задачами Asyncio, работающими на этом цикле и другими потоками в приложении. Я пытался использовать стандартные примитивы, безопасные потока, такие как Threading.Lock, но я все еще сталкиваюсь с условиями гонки и случайными тупиками.python
import asyncio
import threading
shared_state = {}
async def async_worker():
while True:
await asyncio.sleep(1)
# Update shared state
with lock:
shared_state['value'] = shared_state.get('value', 0) + 1
print("Async:", shared_state['value'])
def thread_worker(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
lock = threading.Lock()
loop = asyncio.new_event_loop()
t = threading.Thread(target=thread_worker, args=(loop,))
t.start()
# Schedule async_worker in the separate event loop
asyncio.run_coroutine_threadsafe(async_worker(), loop)
# Meanwhile, update shared state from the main thread
def update_from_main():
for _ in range(5):
with lock:
shared_state['value'] = shared_state.get('value', 0) + 10
print("Main thread update:", shared_state['value'])
time.sleep(2)
import time
update_from_main()
< /code>
Приведенный выше код иногда приводит к противоречивому состоянию или даже висеть. Может помочь обеспечить безопасность потока?
лучше ли ограничить все мутации состояния в поток Asyncio и общаться с другими потоками с помощью очередей сообщений или аналогичных шаблонов?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... event-loop
Как безопасно делиться состоянием между задачами асинсио, работающими в отдельном цикле событий в многопоточном приложен ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение