更多的线索!更简单、更快的线程。
mo-threads的Python项目详细描述
更多的线索!< ><表><广告>分支
状态 < /广告><正文>大师级 DEV 模块线程
线程
与python的线程库相比,它的主要优点是:
- 多线程队列不使用序列化-序列化是 一般来说很好,你也可以在 进程,但对于单进程多线程来说,这是不必要的开销。 它留给程序员来确保放入队列的消息 没有变化,这不是不祥的需求。
- 关闭顺序是确定的和明确的
库缺少控制和有序关闭的严格约定。
这些约定消除了对
interrupt()
和abort()的需要 它们是使用资源时不稳定的习惯用法。每个线程都可以关闭 它自己的条款,但预计这样做很方便。
< > > - 所有线程都需要接受"请停止"信号 希望及时测试;有信号时退出。
- 所有线程都有一个父线程-父线程负责确保 孩子们收到"请停止"信号,在停止前已经死了 他们自己。这一责任被烘焙到线程生成过程中, 所以除非你愿意,否则你不需要处理它。
- 使用信号来简化逻辑 多线程、事件和超时之间的依赖关系。
- 日志记录和分析功能集成在一起-日志记录和异常处理 是无缝集成的:这意味着日志是集中处理的,并且线程 安全。父线程可以访问未捕获的子线程异常,并且 cprofiler正确聚合多个线程的结果。 < > >
- 在方法和共同例程之间调用样式可以容易混淆
- 参与者可以使用阻塞方法,共同例程不能
- 无法使用共同例程管理资源优先级。
- 堆栈跟踪与co例程一起丢失
- 异步作用域很容易脱离词法作用域,这会导致错误 < > >
- 资源-监视器和锁一次只能由一个线程拥有
- 二进制-原语只有两种状态
- 不可逆-原语的状态只能设置或高级,不能反转
wait()
方法将始终在返回之前获取锁。这是一个重要的功能,它可以确保和
块中的每一行都具有锁获取功能,并且更易于推理。
- 通过
\uu exit\uu()
退出锁将始终向等待恢复的线程发出信号。这样可以确保没有信号丢失,每个线程都有机会对可能的更改做出反应。 < > >
它用于什么
等待底层C库和操作系统花费了大量时间 响应网络和文件访问请求的服务。倍数 线程可以使您的代码更快,尽管有gil,当处理那些 请求。例如,通过将注销从主线程移开,我们可以 总速度提高15%,因为我们不再有主线程 正在等待磁盘写入或远程日志记录。请注意,这个级别的 只有在不发生序列化的情况下才能实现速度改进 在多线程队列中。
异步与参与者
我个人认为演员
比异步任务更容易推理。
混合常规方法和共同程序(其产生于
污染)是
危险,因为:
python的异步工作是用另一个名字重新发明线程功能的一个尚不成熟的过程。预计将经历十年的问题,这些问题已经通过线程解决了;下面是一个示例
同步原语
同步原语有三个主要方面:
最后,不可逆性非常有用,但在许多线程中被忽略。 图书馆。不可逆性使我们能够模拟进展;并且 我们可以允许线程轮询进度,或接收进度通知。
这三个方面可以结合起来,为我们提供8个同步原语:
锁定
类
锁与线程监视器相同,除了两个不同之处:
lock=Lowhilenotplease_stop:withlock:whilenottodo:lock.wait(seconds=1)# DO SOME WORK
在本例中,我们查找todo
的内容,如果没有,则等待一秒钟。在此期间,其他人可以获取锁并添加
todo
项。释放锁后,示例代码将立即恢复以查看可用的内容,如果未找到任何内容,请再次等待。
信号
类
信号类是一个只能发出一次信号的二进制信号量;后续信号不起作用。它可以由任何线程发出信号;任何线程都可以等待信号
;一旦发出信号,所有等待的线程都将被解除阻塞,包括所有后续等待的线程。任何线程都可以访问信号的当前状态而无需阻塞。信号
用于模拟线程安全状态推进。它初始化为false
,当发出信号(使用go()
)时变为true
。不能颠倒。
信号就像承诺,但更明确
<表><广告>is_done=Signal()yieldis_done# give signal to another that wants to know when done# DO WORKis_done.go()
您可以将方法附加到信号,该信号将在
go()
时运行一次。如果已经发出信号,则立即运行该方法。
is_done=Signal()is_done.then(lambda:print("done"))returnis_done
您也可以等待信号
,该信号将阻塞当前线程,直到信号
完成为止
is_done=worker_thread.stoppedis_done.wait()is_done=print("worker thread is done")
信号
是第一类,它们可以被传递并与其他信号组合。例如,使用u或
运算符(
):
要么=lhs rhs
;要么在触发
。lhs
或rhs
时触发
defworker(please_stop):whilenotplease_stop:#DO WORK user_cancel=get_user_cancel_signal()worker(user_cancel|Till(seconds=360))
信号
s也可以使用逻辑和(&;
):both=lhs&rhs
;只有在同时触发
lhs
和rhs
时,才会触发两者:
(workerA.stopped&workerB.stopped).wait()print("both threads are done")
直到
类
tillclass是一个特殊的signal
信号,用于表示超时。
Till(seconds=20).wait()Till(till=Date("21 Jan 2016").unix).wait()
使用直到
而不是sleep()
因为可以将直到
对象与其他信号组合起来
请注意,当主线程被要求关闭时,所有到
的对象都将在到期前触发
推荐PyPI第三方库