首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查事件循环中是否有特定参数的协同学的方法?

检查事件循环中是否有特定参数的协同学的方法?
EN

Stack Overflow用户
提问于 2018-02-28 05:29:36
回答 1查看 1.5K关注 0票数 2

在我的应用程序中,我有多个类,这些类可能会给event_loop添加一个协同线。但是我不想不止一次地添加一个协同线,所以我需要一种方法来检查协同线是否已经是运行循环中的一个任务。

我找到了asyncio.Task.all_tasks(循环)类方法。我认为这将解决我的问题,但输出只给出了协同线的名称,而没有给出参数。这对我来说是个问题,因为我正在向event_loop中添加相同的协同线,其中包含不同的参数集。

展示:

代码语言:javascript
复制
import asyncio
from threading import Thread
from time import sleep

async def foo(a, b):
    while True:
        print("{}{}".format(a, b))
        await asyncio.sleep(1)

def loop_starter():
    loop1.create_task(foo("one","two"))
    loop1.create_task(foo("three","four"))
    loop1.run_forever()

loop1 = asyncio.new_event_loop()
t = Thread(target=loop_starter)
t.start()
sleep(0.5)
print(asyncio.Task.all_tasks(loop1))

all_tasks()方法的输出是:

代码语言:javascript
复制
{<Task pending coro=<foo() running at example.py:8> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7f7dbb312b58>()]>>, 
 <Task pending coro=<foo() running at example.py:8> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7f7dbb2a4918>()]>>}

因此,我似乎无法知道事件循环中有哪些版本的foo。

EN

回答 1

Stack Overflow用户

发布于 2018-02-28 07:59:04

唯一能想到的就是这样的事情:

代码语言:javascript
复制
import asyncio


_running = list()  # set would be better if you have hashable values


def create_unique_task(coro_func, *args, **kwargs):
    loop = asyncio.get_event_loop()

    uid = (args, kwargs)
    if uid not in _running:
        task = loop.create_task(foo(*args, **kwargs))
        _running.append(uid)
        task.add_done_callback(lambda _: _running.remove(uid))
    else:
        print('skipped')
        return

    return task


async def foo(a, b):
    print("{} {}".format(a, b))
    await asyncio.sleep(0.5)


async def main():
    create_unique_task(foo, "one", "two")
    create_unique_task(foo, "three", "four")
    await asyncio.sleep(0.2)

    create_unique_task(foo, "one", "two")
    create_unique_task(foo, "three", "four")
    await asyncio.sleep(0.4)

    create_unique_task(foo, "one", "two")
    create_unique_task(foo, "three", "four")
    await asyncio.sleep(1)


if __name__ ==  '__main__':
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    finally:
        loop.run_until_complete(loop.shutdown_asyncgens())
        loop.close()

输出:

代码语言:javascript
复制
one two
three four
skipped
skipped
one two
three four
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49022546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档