线程或进程

时间:2013-02-27 20:10:10

标签: python python-3.x

我基本上都在编写端口扫描程序(不是真的,但它很接近)。逐个ping机只是很慢,所以我肯定需要某种并行处理。瓶颈肯定是网络I / O,所以我认为线程就足够了(python的GIL存在),它们更容易使用。但是,流程的使用会带来显着的性能提升(15%+)吗?

可悲的是,我没有时间尝试这两种方法,并根据某些测量结果选择更好的方法:/

谢谢:)

3 个答案:

答案 0 :(得分:2)

如果您没有时间等待性能测试,那么您可能只是想要猜测。所以:

此处multiprocessing threading可能没有真正的优势。

每个任务的开销都有multiprocessing的缺点。您可以通过调整批量大小来解决这个问题,但是使用threading,您不必这样做。

所以,我会使用线程。

但是,我会使用concurrent.futures.ThreadPoolExecutor进行操作,因此当您稍后获得一段时间后,您可以尝试将单行更改为ProcessPoolExecutor并比较性能。

答案 1 :(得分:1)

我认为我只是将此作为潜在答案发布 我和Gevent一样使用过,但是另一个lib也可以使用。

这取自Gevent的网站

import gevent
from gevent import socket
urls = ['www.google.com', 'www.example.com', 'www.python.org']
jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
gevent.joinall(jobs, timeout=2)
[job.value for job in jobs]
  

[' 74.125.79.106',' 208.77.188.166',' 82.94.164.162']

这将为您提供并发方法,而不会产生线程/进程的开销=)

答案 2 :(得分:0)

一般来说,您希望multiprocessing模块在​​处理过程中利用额外的CPU内核。由于每个进程都有自己的GIL,因此它们可以进行CPU密集型调用,而不管是否有任何特定的调用在其持续时间内锁定GIL。

从编程的角度来看,主要缺点是你的共享内存要少得多。实际上,您只能使用共享对象发送数据,例如multiprocessing.Arraymultiprocessing.Value。而且因为共享的内存很少,所以每次创建另一个实例时,内存占用都会增加一倍。

线程可能是一个可行的选项,但如果你想要最高效率,你应该采用异步方法。异步网络I / O有许多框架,但最着名的可能是Twisted