所以,我编写了这个简单的代码来检查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并使用相同的内存区域是什么意思?另外,线程实际上可以使用队列或其他东西进行并行吗?
答案 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()