+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

睡眠后asyncio任务结束

发布于2021-03-04 22:19     阅读(546)     评论(0)     点赞(12)     收藏(5)


0

1

2

3

4

虽然我广泛使用了线程和多处理,但是我对asyncio还是很陌生,所以我想我会尝试学习它。我试图在这里创建一个小的任务工具类,以生产者/消费者的方式管理一些任务。但是,当我使用该asyncio.sleep函数时,任务在休眠后再也不会完成另一行代码。如果我注释掉睡眠操作,即使我在队列中填充了10000个项目,也只会执行单个任务。我在这里不了解这种行为;我正确使用asyncio吗?

class TaskPool:
    def __init__(self, handler: Callable, size: int, name: str = None):
        self.queue: asyncio.Queue = asyncio.Queue()
        self.tasks: List[asyncio.Task] = []
        self.handler: Callable = handler
        self.size: int = size
        self.name: str = name
    
    async def start(self):
        async def run():
            item: object
            while True:
                item = await self.queue.get()
                await self.handler(item)
                self.queue.task_done()

        for idx in range(self.size):
            tid = '%s_%s' % (self.name, idx) if self.name is not None else None
            self.tasks.append(asyncio.create_task(run(), name=tid))

    async def put(self, item: object):
        await self.queue.put(item)

    async def stop(self):
        await self.queue.join()
        task: asyncio.Task
        for task in self.tasks:
            task.cancel()

def test_taskpool(n: int, m: int):
    async def task(item: object):
        print(asyncio.current_task().get_name())
        print(item)
        await asyncio.sleep(3)

    async def test():
        tp = TaskPool(task, m, 'example')
        for i in range(n):
            await tp.put(i)
        await tp.start()
        return tp
    
    routine = test()
    return asyncio.run(routine)

与执行 sleep

>>> test_taskpool(10, 2)
example_0
0
example_1
1
>>>

没有执行 sleep

>>> test_taskpool(10000, 10)
example_0
0
example_0
1
example_0
2
example_0
3
example_0
4
...
example_0
9999
>>>

解决方案


暂无回答

0

1

2

3

4

5

6

7

8



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/878030/7e66f0ad5019c63e2ce5/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)