Python生成器与线程

时间:2015-04-16 14:36:59

标签: python multithreading generator yield

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

我需要即时操作它们,而其他数据仍然存在。

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

感谢

3 个答案:

答案 0 :(得分:2)

两者都有效。两者都有问题。

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

简短摘要有点:

  • 您可以使用生成器/协同例程或线程或多处理来完成工作
  • 如果任何涉及纯Python的硬计算工作(如numpy的C-Extension可以避免这种情况),Python GIL会咬你的共同例程/线程。
  • 只要你主要做I / O就没那么重要了。如果你有更大的工作块,线程会更好地工作,如果你有更小的块,协同例程往往会更好。如果您使用池,例如从期货模块中,您可以稍微调整和改变行为。

很难说一般哪种方法效果最好,完全取决于你的工作量。

答案 1 :(得分:1)

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

生成器通常不用于网络操作。

答案 2 :(得分:0)

如果在同时处理一部分接收数据时尝试接收更多数据,则需要多线程。这与yield无关,因为在等待接收数据时,屈服仍会阻止同时处理。