2015-02-23 42 views
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() 

所以我的问题是什么是使用,如果它是不是真的平行甚至可以节省工控机,并使用相同的内存区域的线程模块的地步?另外,线程可以使用队列或其他东西并行吗?

回答

3

好像你尽快加入你的线程,当你开始他们:

for t in threads: 
    t.start() 
    t.join() 

IIRC,Thread.join将等待线程完成,然后再继续(这意味着你等待第一个线程启动第二)...

一般来说之前完成,则需要2个循环:

for t in threads: 
    t.start() 
# other stuff to do in the main thread... 
for t in thread: 
    t.join() 
+0

雅我改变了这一切。但是,与多处理相比,性能仍然不同,因为可以称为更强大的线程? – TommyT 2015-02-23 19:55:45

+0

@gusc - 正是_how_你获得的性能好处取决于你在线程中做了什么。关键是,无论你在线程中做什么,都必须释放GIL才能实现并行代码 - 否则,python将一次只做一件事(尽管它会在你的线程之间来回切换以确定那1件事实际上是什么)。 'multiprocessing'将真正并行地执行你的任务(不管GIL),尽管进程之间的共享状态更难以管理(并且代价昂贵)。 – mgilson 2015-02-23 19:57:30

+0

好的。感谢@mgilson。我会研究更多关于GIL的。在使用多处理和多线程的时候,还有其他的关键点,因为我试图设计一些面向客户的东西,如果它产生了太多的线程/每个用户的请求并且可能变得更难管理,那么CPU可能会超载。 – TommyT 2015-02-23 19:59:12

相关问题