【问题标题】:Python Generators Vs ThreadPython 生成器与线程
【发布时间】:2015-06-23 01:18:04
【问题描述】:

我有来自套接字的连续数据流。

我需要在运行中对它们进行操作,而其他数据仍在进行中。

使用yield(类似生成器)还是线程更好?

谢谢

【问题讨论】:

    标签: python multithreading generator yield


    【解决方案1】:

    最好使用线程处理长时间运行的网络(套接字)操作。如果您有任何活动要在主线程中完成(或在接收来自套接字的输入之后),这将特别有用。

    生成器一般不用于网络操作。

    【讨论】:

      【解决方案2】:

      如果在处理部分接收到的数据同时尝试接收更多数据,则需要多线程。这与产量无关,因为在等待接收数据时,产量仍然会阻止您的同时处理。

      【讨论】:

        【解决方案3】:

        两者都有效。两者都有自己的问题。

        David Beazley 很好地谈论了两者的问题,并在这个 PyCon 2015 谈话视频中进行了说明: https://www.youtube.com/watch?v=MCs5OvhV9S4

        简短的总结是这样的:

        • 您可以同时使用生成器/协同例程或线程或多处理来完成您的工作
        • 如果有任何事情涉及纯 Python 中的繁重计算工作,Python GIL 会为您提供协程/线程(像 numpy 这样的 C-Extension 可以避免这种情况)。
        • 只要您主要进行 I/O,这并不重要。如果你有更大的工作块,线程会更好地工作,如果你有更小的工作块,协同程序往往会更好地工作。如果您使用池,例如在 futures 模块中,您可以稍微调整和更改行为。

        很难说总体上什么最有效,这完全取决于您的工作量。

        【讨论】:

        • 感谢您的回答。观看 David 的脚本非常棒。
        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 2011-01-19
        • 1970-01-01
        • 2017-05-02
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        相关资源
        最近更新 更多