没有项目描述
aioexec的Python项目详细描述
aioexec
说明
aioexec是围绕concurrent.futures
包和asyncio的loop.run_in_executor
方法的一个简单、直观的界面。aioexec是leightweight,没有依赖关系和~100 loc。
要求
aioexec需要python>= 3.6
安装
pip install aioexec
或
pipenv install aioexec
用法
没有aioexec
通常运行这样的执行器:
importaysnciofromconcurrent.futuresimportProcessPoolExecutor# ...loop=asyncio.get_event_loop()foo=awaitloop.run_in_executor(ProcessPoolExecutor(1),lambda:my_func(foo='baz'))
使用aioexec
也可以这样做:
fromaioexecimportProcs# ...foo=awaitProcs(1).call(my_func,foo='baz')
您可以在同一个执行器中调用一个batch
函数,如下所示:
importasynciofromaioexecimportProcs,Call# ...my_values=awaitasyncio.gather(*Procs(3).batch(Call(my_func,foo='bar'),Call(my_func,foo='baz'),Call(my_func,foo='qux'),))
这与理解很好地配合:
importasynciofromaioexecimportProcs,Call# ...my_values=awaitasyncio.gather(*Procs(10).batch(Call(my_func,foo=i)foriinrange(0,10)))
您还可以生成一个pool
,并使用同一个执行器进行多个不同的调用:
importasynciofromaioexecimportProcs,Call# ...withProcs(10)aspool:value_a=awaitpool.call(my_func,foo='baz')value_b=awaitaio.gather(*pool.batch(Call(my_func,foo=i)foriinrange(0,10)))# etc...
上面的例子同样适用于Threads
,例如:
fromaioexecimportThreads# ...foo=awaitThreads(1).call(my_func,foo='baz')
如有必要,您可以将事件loop
传递给执行者,如下所示:
foo=awaitThreads(1,my_loop).call(my_func,foo='baz')foo=awaitProcs(1,my_loop).call(my_func,foo='baz')
开发/测试
克隆repo并安装开发包:
pipenv install --dev
运行测试:
pipenv run python make.py test