python3.5的多任务库+
pytasking的Python项目详细描述
任务分配
Python3.5+的一个简单库,为多任务处理提供了一个简单的接口。在
目录
依赖关系
- Python 3.5+
标准库之外没有外部模块依赖项,但是,如果您想利用uvloop
,您可以安装它,pytasking
库将自动使用它(仅在Linux/MacOS上可用)。
安装
来源
- 在项目根目录中包含目录
pytasking
。在 - 如果在Linux/MacOS上,则运行
python -m pip install -r requirements.txt
。在
PyPi
- 运行
pip install pytasking
。在
使用
一个基本的python示例:
#!/usr/bin/env pythonimportpytaskingimporttimedefhello(hello_queue):whileTrue:hello_queue.put_nowait("Hello World!")pytasking.sleep(1.5,sync=True)asyncdefping():whileTrue:try:print("Ping!")awaitpytasking.sleep(1.0)print("Pong!")exceptpytasking.asyncio.CancelledError:print("Pang!")breakasyncdefmain(task_manager):hellos=0hello_queue=pytasking.multiprocessing.Queue()hello_proc=task_manager.add_proc(hello,hello_queue)whileTrue:try:ifhellos==5:task_manager.delete_proc(hello_proc)ifhello_queue.qsize()>0:try:print(hello_queue.get_nowait())hellos+=1except:passping_task=task_manager.add_task(ping)awaitpytasking.sleep(0.5)task_manager.delete_task(ping_task)exceptpytasking.asyncio.CancelledError:breakif__name__=="__main__":task_manager=pytasking.Manager()task_manager.add_task(main,task_manager)try:task_manager.start()exceptKeyboardInterrupt:passexcept:raise
美国石油学会
class pytasking.Manager()
Manager
类的实例为程序提供异步事件循环。目前pytasking在任何给定时间只支持1个异步事件循环。在
异步任务和并行进程由Manager
实例派生和管理。在
add_task(task, *args, **kwargs)
从函数定义创建异步任务。像平常一样传递参数和关键字参数。此函数从任务的has返回一个id。您可以使用id来检索和删除任务。请确保使用以下模板定义函数:
^{pr2}$任务将立即开始,您可以随时添加任务。在
delete_task(t_id)
给定任务id,您可以调用删除任务。此方法调用协程的cancel()
方法,如果在pytasking.CancelledError
中捕获和处理,它将给协程清理的机会,甚至拒绝请求。在
get_task(t_id)
如果要检索底层协同程序,可以使用此方法并提供任务id来获取它。在
get_tasks()
这将以列表形式返回所有任务ID,您可以将此方法与get_task(t_id)
结合使用。在
add_proc(proc, *args, **kwargs)
从函数定义创建并行进程。像平常一样传递参数和关键字参数。此函数从进程的has返回一个id。您可以使用id来检索和删除进程。请注意,默认情况下,进程按顺序运行。尝试使用此模板:
defparallel_process():# Define any arguments or keyword arguments as you normally would.# Do whatever you need to do here as you normally would.# If you want this task to run indefinitely, do this:whileTrue:try:# Do something forever.pytasking.sleep(1.0,sync=True)except:raise
delete_proc(p_id)
给定一个进程id,就可以调用来删除一个进程。此方法调用terminate()
和join()
来尝试干净地关闭进程。在进程访问管道或队列时关闭进程可能会损坏资源。在
get_proc(p_id)
如果要检索底层进程,可以使用此方法并提供进程id来获取它。在
{这将以列表形式返回所有进程ID,您可以将此方法与get_process(p_id)
结合使用。在
start()
这将启动Manager
实例并启动所有添加的任务和进程。在
已知问题
递归生成
在某些情况下,您可能无法在任务中生成任务、流程中的流程、流程中的任务或任务中的流程。我需要进一步调查。在
管道/队列损坏
如果决定删除某个进程,请小心,如果该进程正在访问队列或管道,则该队列或管道可能会损坏,并且无法再次使用。在
变更日志
1.2
- 改变命名约定,朝着1.x约定前进。
打破变化
- 来自
asyncio
和multiprocessing
模块的所有包装异常和数据结构现在都已命名为pytasking。例如,pytasking.CancelledError
现在是pytasking.asyncio.CancelledError
。这种变化是为了使它更加明确和自然。在
1.1.0
- 改进文档。在
- 为Manager类实现了附加的helper方法–有关详细信息,请参阅文档。在
1.0.0
- 这是pytasking的初始版本。在
- 项目
标签: