我正在尝试运行以下代码。该代码是一个示例,用于从另一个线程向队列添加项目,并且如果未为队列提供新项目,则在发生超时时发生异常。
import asyncio
import threading
import time
async def responder(queue, value):
value["value"] = await queue.get()
async def worker(queue):
value = dict()
while True:
print("waiting")
# new_msg = await queue.get()
asyncio.wait_for(responder(queue, value), timeout=2)
print(value)
print("worked")
class wManager():
def __init__(self):
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
self.queue = asyncio.Queue()
self.loop.create_task(worker(self.queue))
self.msg = 0
def add(self):
print("queue Size Before"+str(self.queue.qsize()))
asyncio.run_coroutine_threadsafe(self.queue.put(self.msg), self.loop)
self.msg += 1
print("queue Size After"+str(self.queue.qsize()))
def start(self):
self.loop.run_forever()
def print_after_sleep(manager):
while True:
print("hi!")
time.sleep(3)
manager.add()
def manager_runer(manager):
manager.start()
if __name__ == "__main__":
manager = wManager()
manager_thread = threading.Thread(target=manager_runer, args=(manager,), daemon=True)
sleepy_thread = threading.Thread(
target=print_after_sleep, args=(manager,), daemon=True)
sleepy_thread.start()
manager_thread.start()
sleepy_thread.join()
如果希望在预定时间后队列未获取新项目,我希望能够超时。
问题是responder()
没有被等待。
谢谢
答案 0 :(得分:1)
您在await
前面缺少asyncio.wait_for()
。您可能还想添加一个try / catch来处理在超时情况下调用引发的TimeoutError
。