2
所以,我写了这个简单的代码来检查,如果蟒蛇线程模块是真正平行,我发现,在这种情况下,线程模块是否真的在python中并行?还是我们需要使用多处理?
from threading import Thread, current_thread
import multiprocessing as mp
def callback(result):
print result
def run_sql(n):
print current_thread()
for i in range(n):
i=i+1
print 'done for ', current_thread()
if __name__=='__main__':
n=100000000
pool = mp.Pool(5)
threads= [ Thread(target=run_sql, args=(n,)) for i in range(5)]
for t in threads:
t.start()
for t in threads:
t.join()
我试图与Pool.apply_async同这实际上是平行的。
def callback(result):
print result
def run_sql(n):
print current_thread()
for i in range(n):
i=i+1
print 'done for ', current_thread()
if __name__=='__main__':
print datetime.datetime.now()
n=100000000
pool = mp.Pool(5)
for i in range(10):
pool.apply_async(run_sql, args= (n,),callback=callback)
pool.close()
pool.join()
所以我的问题是什么是使用,如果它是不是真的平行甚至可以节省工控机,并使用相同的内存区域的线程模块的地步?另外,线程可以使用队列或其他东西并行吗?
雅我改变了这一切。但是,与多处理相比,性能仍然不同,因为可以称为更强大的线程? – TommyT 2015-02-23 19:55:45
@gusc - 正是_how_你获得的性能好处取决于你在线程中做了什么。关键是,无论你在线程中做什么,都必须释放GIL才能实现并行代码 - 否则,python将一次只做一件事(尽管它会在你的线程之间来回切换以确定那1件事实际上是什么)。 'multiprocessing'将真正并行地执行你的任务(不管GIL),尽管进程之间的共享状态更难以管理(并且代价昂贵)。 – mgilson 2015-02-23 19:57:30
好的。感谢@mgilson。我会研究更多关于GIL的。在使用多处理和多线程的时候,还有其他的关键点,因为我试图设计一些面向客户的东西,如果它产生了太多的线程/每个用户的请求并且可能变得更难管理,那么CPU可能会超载。 – TommyT 2015-02-23 19:59:12