更多的线索!更简单、更快的线程。

mo-threads的Python项目详细描述


更多的线索!< ><表><广告>分支 状态< /广告><正文>大师级生成状态 DEV生成状态覆盖状态

模块线程

与python的线程库相比,它的主要优点是:

  1. 多线程队列不使用序列化-序列化是 一般来说很好,你也可以在 进程,但对于单进程多线程来说,这是不必要的开销。 它留给程序员来确保放入队列的消息 没有变化,这不是不祥的需求。
  2. 关闭顺序是确定的和明确的 库缺少控制和有序关闭的严格约定。 这些约定消除了对interrupt()abort()的需要 它们是使用资源时不稳定的习惯用法。每个线程都可以关闭 它自己的条款,但预计这样做很方便。
  3. < > >
    • 所有线程都需要接受"请停止"信号 希望及时测试;有信号时退出。
    • 所有线程都有一个父线程-父线程负责确保 孩子们收到"请停止"信号,在停止前已经死了 他们自己。这一责任被烘焙到线程生成过程中, 所以除非你愿意,否则你不需要处理它。
    1. 使用信号来简化逻辑 多线程、事件和超时之间的依赖关系。
    2. 日志记录和分析功能集成在一起-日志记录和异常处理 是无缝集成的:这意味着日志是集中处理的,并且线程 安全。父线程可以访问未捕获的子线程异常,并且 cprofiler正确聚合多个线程的结果。
    3. < > >

      它用于什么

      等待底层C库和操作系统花费了大量时间 响应网络和文件访问请求的服务。倍数 线程可以使您的代码更快,尽管有gil,当处理那些 请求。例如,通过将注销从主线程移开,我们可以 总速度提高15%,因为我们不再有主线程 正在等待磁盘写入或远程日志记录。请注意,这个级别的 只有在不发生序列化的情况下才能实现速度改进 在多线程队列中。

      异步与参与者

      我个人认为演员 比异步任务更容易推理。 混合常规方法和共同程序(其产生于污染)是 危险,因为:

      1. 在方法和共同例程之间调用样式可以容易混淆
      2. 参与者可以使用阻塞方法,共同例程不能
      3. 无法使用共同例程管理资源优先级。
      4. 堆栈跟踪与co例程一起丢失
      5. 异步作用域很容易脱离词法作用域,这会导致错误
      6. < > >

        python的异步工作是用另一个名字重新发明线程功能的一个尚不成熟的过程。预计将经历十年的问题,这些问题已经通过线程解决了;下面是一个示例

        同步原语

        同步原语有三个主要方面:

        • 资源-监视器和锁一次只能由一个线程拥有
        • 二进制-原语只有两种状态
        • 不可逆-原语的状态只能设置或高级,不能反转

        最后,不可逆性非常有用,但在许多线程中被忽略。 图书馆。不可逆性使我们能够模拟进展;并且 我们可以允许线程轮询进度,或接收进度通知。

        这三个方面可以结合起来,为我们提供8个同步原语:

        • --信号量
        • -b--二进制信号量
        • r----监视器
        • r b--锁定
        • --i-迭代器/生成器
        • -b i-信号(或承诺)
        • r-i-专用迭代器
        • r b i-专用信号(最好实现为完成布尔标志)

        锁定

        锁与线程监视器相同,除了两个不同之处:

        1. wait()方法将始终在返回之前获取锁。这是一个重要的功能,它可以确保块中的每一行都具有锁获取功能,并且更易于推理。
        2. 通过\uu exit\uu()退出锁将始终向等待恢复的线程发出信号。这样可以确保没有信号丢失,每个线程都有机会对可能的更改做出反应。
        3. < > >
          lock=Lowhilenotplease_stop:withlock:whilenottodo:lock.wait(seconds=1)# DO SOME WORK

          在本例中,我们查找todo的内容,如果没有,则等待一秒钟。在此期间,其他人可以获取锁并添加todo项。释放锁后,示例代码将立即恢复以查看可用的内容,如果未找到任何内容,请再次等待。

          信号

          信号是一个只能发出一次信号的二进制信号量;后续信号不起作用。它可以由任何线程发出信号;任何线程都可以等待信号;一旦发出信号,所有等待的线程都将被解除阻塞,包括所有后续等待的线程。任何线程都可以访问信号的当前状态而无需阻塞。信号用于模拟线程安全状态推进。它初始化为false,当发出信号(使用go())时变为true。不能颠倒。

          信号就像承诺,但更明确

          <表><广告>信号承诺 < /广告><正文>s.go()s.resolve()s.然后(f)s.然后(m)s.wait()等待 S&T承诺。全部(s,t)s t承诺。比赛(s,t)
          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要么在触发lhsrhs时触发

          defworker(please_stop):whilenotplease_stop:#DO WORK user_cancel=get_user_cancel_signal()worker(user_cancel|Till(seconds=360))

          信号s也可以使用逻辑和(&;):both=lhs&rhs只有在同时触发lhsrhs时,才会触发两者:

          (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()因为可以将直到对象与其他信号组合起来

          请注意,当主线程被要求关闭时,所有的对象都将在到期前触发

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

          推荐PyPI第三方库


热门话题
ArrayList Java中的搜索字符串   另一个web应用程序的java访问会话   另一个应用程序中的活动和服务之间的java通信   java根据Json字符串类型将Json字符串转换为对象   eclipse如何解决java中的错误异常。lang.NoSuchMethodError:'java。字符串javax。摆动JOptionPane。showInputDialog(java.lang.String)'   线程“main”java中的安卓异常。lang.NoClassDefFoundError:org/codehaus/jackson/JsonParseException   java如何在安卓 emulator上显示Mat图像?使用NDK   Java在本地读取测试源文件,但在服务器上读取失败   java dowhile循环用于计算输入数字中的数字。故障排除代码   JAva初学者在编写获取成本的方法时遇到困难   java是shell游戏。我如何让物体移动,特别是在特定的曲线上,但顺序是随机的?   java如何区分两个同名的JButton   java为什么我在Spring Boot中需要一个接口?   java将文件路径插入数据库将删除\   使用InterfaceType初始化java对象   java如何部署一个分为Angular、Spring Boot和MySQL的项目?   java如何使用Symja解决不等式?