在thread/threadpool/ioloop中运行函数的修饰符

threaded的Python项目详细描述


螺纹的

https://travis-ci.com/python-useful-helpers/threaded.svg?branch=masterAzure DevOps buildshttps://coveralls.io/repos/github/python-useful-helpers/threaded/badge.svg?branch=masterDocumentation Statushttps://img.shields.io/pypi/v/threaded.svghttps://img.shields.io/pypi/pyversions/threaded.svghttps://img.shields.io/pypi/status/threaded.svghttps://img.shields.io/github/license/python-useful-helpers/threaded.svghttps://img.shields.io/badge/code%20style-black-000000.svg

threaded是一组decorators,它将函数包装成:

  • concurrent.futures.ThreadPool
  • threading.Thread
  • asyncio.Task in Python 3.

为什么?因为复制粘贴loop.create_taskthreading.threadthread_pool.submit很无聊, 尤其是当目标函数仅以这种方式使用时。

优点:

Python 3.4
Python 3.5
Python 3.6
Python 3.7
PyPy3 3.5+

注意

对于python 2.7/pypy,您可以使用1.x.x版

装饰工:

  • 线程池-nativeconcurrent.futures.ThreadPool
  • threadpooledthreadpooled的别名。
  • 线程化-包装成threading.Thread
  • threadedthreaded的别名。
  • 异步任务-包装成asyncio.Task。使用与threadpooled相同的api。
  • 异步任务是异步任务的别名。

用法

线程池

大多数情况下,它是必需的decorator:submit函数在调用时提交给threadpoolexecutor。

注意

python 3和python 2.7之间的api有很大不同。见下面的API部分。

threaded.ThreadPooled.configure(max_workers=3)

注意

默认情况下,如果未配置executor,则使用默认参数进行配置:max_workers=CPU_COUNT * 5

@threaded.ThreadPooleddeffunc():passconcurrent.futures.wait([func()])

python 3.5+与asyncio一起使用:

注意

如果循环getter不可调用,则忽略循环getter need上下文。

loop=asyncio.get_event_loop()@threaded.ThreadPooled(loop_getter=loop,loop_getter_need_context=False)deffunc():passloop.run_until_complete(asyncio.wait_for(func(),timeout))

python 3.5+使用从调用参数中提取异步和循环:

loop_getter=lambdatgt_loop:tgt_loop@threaded.ThreadPooled(loop_getter=loop_getter,loop_getter_need_context=True)# loop_getter_need_context is requireddeffunc(*args,**kwargs):passloop=asyncio.get_event_loop()loop.run_until_complete(asyncio.wait_for(func(loop),timeout))

在应用程序关闭期间,可以停止池(如果某个组件请求,池将自动重新创建)。

threaded.ThreadPooled.shutdown()

螺纹

经典的threading.Thread。用于运行直到关闭和自动关闭线程而不返回。

用法示例:

@threaded.Threadeddeffunc(*args,**kwargs):passthread=func()thread.start()thread.join()

如果没有参数,线程名将使用模式:'Threaded: ' + func.__name__

注意

如果函数名不可访问,则使用str(hash(func))。

重写名可以通过相应的参数don:

@threaded.Threaded(name='Function in thread')deffunc(*args,**kwargs):pass

线程可以自动守护:

@threaded.Threaded(daemon=True)deffunc(*args,**kwargs):pass

另外,如果在线程启动之前不需要任何添加操作, 可在返回前自动启动:

@threaded.Threaded(started=True)deffunc(*args,**kwargs):pass

异步任务

asyncio.Task包装。

异步使用:

@threaded.AsyncIOTaskdeffunc():passloop=asyncio.get_event_loop()loop.run_until_complete(asyncio.wait_for(func(),timeout))

直接提供事件循环:

注意

如果循环getter不可调用,则忽略循环getter need上下文。

loop=asyncio.get_event_loop()@threaded.AsyncIOTask(loop_getter=loop)deffunc():passloop.run_until_complete(asyncio.wait_for(func(),timeout))

用于从调用参数中提取循环:

loop_getter=lambdatgt_loop:tgt_loop@threaded.AsyncIOTask(loop_getter=loop_getter,loop_getter_need_context=True)deffunc(*args,**kwargs):passloop=asyncio.get_event_loop()loop.run_until_complete(asyncio.wait_for(func(loop),timeout))

测试

软件包的主要测试机制是使用tox。 可用环境可通过tox-l

收集

CI系统

对于代码检查,多个ci系统并行使用:

  1. Travis CI:用于检查:pep8、pylint、bandit、安装可能性和单元测试。同时它还出版了关于工作服的报道。
  2. coveralls:用于显示覆盖率。
  3. Azure CI:用于windows上的功能测试。

CD系统

Travis CI:用于pypi上的包传递。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java用变化的替换字符串替换子字符串   从数据库中断中恢复的oracle Java DAL?   Android/Java页边距位于左/右/底部   java如何用相同的源代码构建不同的APK?(我发现了一个错误)   java正则表达式,仅当字符串以一行中的3个数字开头时才匹配第一个数字   使用以xml为输入的给定端点调用java中的rest-ful web服务?   java长字符串转换为UTF8引发异常   java如何使用截取方法获取ArrayList   java将计算列添加到可观察列表中   正则表达式如何在java正则表达式中使用组?   java正则表达式只接受字母表和空格,不允许在字符串的开头和结尾使用空格   java简单onclick按钮在安卓中不起作用   java如何在Spring中只实现Crudepository的特定方法?   java无法使用json对象NPE读取jsonarray   java我可以添加maven依赖项,这些依赖项被打包为除此之外的任何东西。罐子