我基本上都在编写端口扫描程序(不是真的,但它很接近)。逐个ping机只是很慢,所以我肯定需要某种并行处理。瓶颈肯定是网络I / O,所以我认为线程就足够了(python的GIL存在),它们更容易使用。但是,流程的使用会带来显着的性能提升(15%+)吗?
可悲的是,我没有时间尝试这两种方法,并根据某些测量结果选择更好的方法:/
谢谢:)
答案 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.Array
或multiprocessing.Value
。而且因为共享的内存很少,所以每次创建另一个实例时,内存占用都会增加一倍。
线程可能是一个可行的选项,但如果你想要最高效率,你应该采用异步方法。异步网络I / O有许多框架,但最着名的可能是Twisted。