在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 Google Billing Library:QueryPurchaseAsync:取消购买的订阅资源未返回   java转换列表mapsturct中的单个对象   java简单算法。我做不好   包含集合的@ManyToMany映射的java JPA2持久性   在Java中序列化和反序列化对象时发生BuffereImage错误   java使用ui:param传递值并在backingbean中访问它们   java从应用程序读取配置。yml至POJO列表地图   java中在while循环外部调用文件值   java如何与来自不同类的UI交互   java如何在jTable中显示2D数组?   在Java 8中,类为什么不从接口继承默认方法?   java类。getAnnotation和getAnnotations无法正常工作   java处理pagertabstrip上的触摸事件   java GWT和struts2异常   用Java解析HTTP查询字符串   java这段代码SQL注入安全吗?