将异步/线程/进程抽象成worker的框架:python-worker (网络编程)
https://github.com/Danangjoyoo/python-worker
还挺好用的,一旦写了一些会阻塞异步函数的逻辑,就需要将其移到新线程/进程去执行。如果不用这个库,就需要重构代码。代码需求经常变动,这个库就不错。
import asyncio
import time
import threading
from worker import async_worker, ThreadWorkerManager
def is_main_thread():
return threading.current_thread() == threading.main_thread()
@async_worker
async def go(text=''):
th = threading.current_thread()
print(text, is_main_thread(), th.native_id, th.name)
for i in range(2):
time.sleep(0.5)
print(f'{text}{i}')
print(f"done{text}")
return f"{text}result"
async def main():
th = threading.current_thread()
print(is_main_thread(), th.native_id, th.name)
tasks = [go('😄'), go('😭')]
tasks = [await t for t in tasks] # 这里的await并不会阻塞主线程
ThreadWorkerManager.await_workers(*tasks) # 这里才会阻塞,也应该阻塞,否则t.ret=None
for t in tasks:
print('print:', t.ret)
Runner = asyncio.run(main())
预期结果:
True 490863 MainThread
😄 False 490864 Thread-1 (<lambda>)
😭 False 490865 Thread-2 (<lambda>)
😄0
😭0
😄1
done😄
😭1
done😭
print: 😄result
print: 😭result

浙公网安备 33010602011771号