python3 异步 asyncio 动态添加任务

本文介绍了在使用asyncio.run_forever()的情况下,如何通过两种方法动态添加任务:使用asyncio.run_coroutine_threadsafe()和asyncio.call_soon_threadsafe()。前者适用于coroutine对象的添加,后者则可以用于IO密集型任务的调度。
部署运行你感兴趣的模型镜像

asyncio.run_forever()下动态添加任务

方法一、asyncio.run_coroutine_threadsafe(coroutine, loop)

方法二、asyncio.call_soon_threadsafe(callback, *args, context=None)

 

方法一、实例run_coroutine_threadsafe

通过添加新的coroutin对象,放入loop内,动态添加。(爬虫正解)

import asyncio
import time

from threading import Thread


def start_loop(loop):
    asyncio.set_event_loop(loop)
    print("start loop", time.time())
    loop.run_forever()


async def do_some_work(x):
    print('start {}'.format(x))
    await asyncio.sleep(x)
    print('Done after {}s'.format(x))


new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()

asyncio.run_coroutine_threadsafe(do_some_work(6), new_loop)
asyncio.run_coroutine_threadsafe(do_some_work(4), new_loop)

方法二、实例call_soon_threadsafe

如果是io操作,就会相当于变成线程去阻塞执行添加进去的函数,密集型则没关系。

import asyncio
import time
from threading import Thread


def start_loop(loop):
    asyncio.set_event_loop(loop)
    print("start loop")
    loop.run_forever()


def more_work(x):
    print('start work {}'.format(x))
    time.sleep(x)
    print('Finished work {}'.format(x))


new_loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(new_loop,))
t.start()

new_loop.call_soon_threadsafe(more_work, 6)
new_loop.call_soon_threadsafe(more_work, 3)

 

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值