wait_for超时结束asyncio.queue没有超时不起作用

时间:2020-03-15 17:34:10

标签: python-asyncio

我正在尝试运行以下代码。该代码是一个示例,用于从另一个线程向队列添加项目,并且如果未为队列提供新项目,则在发生超时时发生异常。

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()没有被等待。

谢谢

1 个答案:

答案 0 :(得分:1)

您在await前面缺少asyncio.wait_for()。您可能还想添加一个try / catch来处理在超时情况下调用引发的TimeoutError