У меня есть программа с одним основным потоком, где я создаю второй поток, который использует asyncio. Есть ли инструменты для синхронизации этих двух потоков? Если бы все было асинхронно, я мог бы сделать это с его примитивами синхронизации, например:
import asyncio
async def taskA(lst, evt):
print(f'Appending 1')
lst.append(1)
evt.set()
async def taskB(lst, evt):
await evt.wait()
print('Retrieved:', lst.pop())
lst = []
evt = asyncio.Event()
asyncio.get_event_loop().run_until_complete(asyncio.gather(
taskA(lst, evt),
taskB(lst, evt),
))
Однако это не работает с несколькими потоками. Если я просто использую threading.Event
, тогда он заблокирует поток асинхронности. Я понял, что могу отложить ожидание до исполнителя:
import asyncio
import threading
def taskA(lst, evt):
print(f'Appending 1')
lst.append(1)
evt.set()
async def taskB(lst, evt):
asyncio.get_event_loop().run_in_executor(None, evt.wait)
print('Retrieved:', lst.pop())
def targetA(lst, evt):
taskA(lst, evt)
def targetB(lst, evt):
asyncio.set_event_loop(asyncio.new_event_loop())
asyncio.get_event_loop().run_until_complete(taskB(lst, evt))
lst = []
evt = threading.Event()
threadA = threading.Thread(target=targetA, args=(lst, evt))
threadB = threading.Thread(target=targetB, args=(lst, evt))
threadA.start()
threadB.start()
threadA.join()
threadB.join()
Однако иметь поток исполнителя только для ожидания мьютекса кажется неестественным. Это так, как это должно быть сделано? Или есть другой способ асинхронно ожидать синхронизации между потоками ОС?