这里是一些有关于 Python 2.6.x 的性能数据,对于线程在输入/输出密集场景中比多进程更高效的观点提出了质疑。这些结果来自一个拥有40个处理器的 IBM System x3650 M4 BD。
输入/输出密集处理:进程池优于线程池。
>>> do_work(50, 300, 'thread','fileio')
do_work function took 455.752 ms
>>> do_work(50, 300, 'process','fileio')
do_work function took 319.279 ms
CPU密集型处理:进程池比线程池表现更好。
>>> do_work(50, 2000, 'thread','square')
do_work function took 338.309 ms
>>> do_work(50, 2000, 'process','square')
do_work function took 287.488 ms
这些并不是严格的测试,但它们告诉我,在与线程相比较时,多进程并不完全性能低下。
上述测试中在交互式Python控制台中使用的代码。
from multiprocessing import Pool
from multiprocessing.pool import ThreadPool
import time
import sys
import os
from glob import glob
text_for_test = str(range(1,100000))
def fileio(i):
try :
os.remove(glob('./test/test-*'))
except :
pass
f=open('./test/test-'+str(i),'a')
f.write(text_for_test)
f.close()
f=open('./test/test-'+str(i),'r')
text = f.read()
f.close()
def square(i):
return i*i
def timing(f):
def wrap(*args):
time1 = time.time()
ret = f(*args)
time2 = time.time()
print '%s function took %0.3f ms' % (f.func_name, (time2-time1)*1000.0)
return ret
return wrap
result = None
@timing
def do_work(process_count, items, process_type, method) :
pool = None
if process_type == 'process' :
pool = Pool(processes=process_count)
else :
pool = ThreadPool(processes=process_count)
if method == 'square' :
multiple_results = [pool.apply_async(square,(a,)) for a in range(1,items)]
result = [res.get() for res in multiple_results]
else :
multiple_results = [pool.apply_async(fileio,(a,)) for a in range(1,items)]
result = [res.get() for res in multiple_results]
do_work(50, 300, 'thread','fileio')
do_work(50, 300, 'process','fileio')
do_work(50, 2000, 'thread','square')
do_work(50, 2000, 'process','square')
Thread
模块(在Python 3.x中称为_thread
)。老实说,我自己从来没有理解过它们之间的区别... - DunnoThread
/_thread
文档明确指出的那样,它是“低级原语”。您可以使用它来构建自定义同步对象,控制线程树的加入顺序等。如果您无法想象为什么需要使用它,请不要使用它,而应坚持使用threading
。 - abarnert