线程模块在python中是否真的并行,还是我们需要使用多处理?

时间:2015-02-23 19:51:48

标签: python multithreading python-multiprocessing

所以,我编写了这个简单的代码来检查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()

所以我的问题是如果使用Threading模块它是不是真的并行,即使它保存IPC并使用相同的内存区域是什么意思?另外,线程实际上可以使用队列或其他东西进行并行吗?

1 个答案:

答案 0 :(得分: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()