Как безопасно делиться состоянием между задачами асинсио, работающими в отдельном цикле событий в многопоточном приложенPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как безопасно делиться состоянием между задачами асинсио, работающими в отдельном цикле событий в многопоточном приложен

Сообщение Anonymous »

Я работаю над приложением 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»