2015-04-16 49 views
-2

我有一个连续的数据流,来自一个套接字。Python发电机与线程

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

使用yield(发电机状)还是线程更好?

谢谢

回答

1

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

发电机一般不用于网络运行。

0

如果在处理接收数据的一部分的同时尝试接收更多数据,则需要多线程。这与yield没有任何关系,因为在等待数据被接收的同时,yielding仍然会阻止您的同时处理。

2

这两个工作。两者都有他们的问题。

大卫比兹利很好地谈到双方的问题,并说明了它在这个PYCON 2015年的谈话视频: https://www.youtube.com/watch?v=MCs5OvhV9S4

简短的总结是怎么样的:

  • 您可以使用两台发电机/协同例程或线程或多处理来完成您的工作
  • 如果有任何事情涉及纯Python中的硬计算工作(像numpy这样的C-Extension可以避免这种情况),那么Python GIL会咬合你的协同例程/线程。
  • 只要你主要做I/O,这并不重要。如果工作量较大,则线程效果会更好,如果您的块较小,则协调程序的效果会更好。如果您使用游泳池,例如从期货模块中,您可以调整并改变行为。

很难说一般情况下效果最好,完全取决于您的工作量。

+0

谢谢你的答案。看大卫脚本是太棒了。 – arj