Python:了解线程模块

时间:2014-03-15 00:36:15

标签: python multithreading multiprocessing

在学习Python的线程模块时,我进行了一项简单的测试。有趣的是线程按顺序运行而不是并行运行。是否可以修改此测试代码,以便程序以与多处理相同的方式执行线程:并行执行?

import threading

def mySlowFunc(arg):
    print "\nStarting...", arg
    m=0
    for i in range(arg):
        m+=i
    print '\n...Finishing', arg

myList =[35000000, 45000000, 55000000]

for each in myList:
    thread = threading.Thread(target=mySlowFunc, args=(each,) )
    thread.daemon = True
    thread.start()
    thread.join()

print "\n Happy End \n"

修订后的代码:

此版本的代码将启动6'线程'并行运行'。但即使有6个线程,实际上只使用了两个CPU线程(其他6个物理CPU线程将空闲并且什么都不做)。

import threading

def mySlowFunc(arg):
    print "\nStarting " + str(arg) + "..."
    m=0
    for i in range(arg):
        m+=i
    print '\n...Finishing ' + str(arg)

myList =[35000000, 45000000, 55000000, 25000000, 75000000, 65000000]


for each in myList:
    thread = threading.Thread(target=mySlowFunc, args=(each,) )
    thread.daemon = False
    thread.start()

print "\n Bottom of script reached \n"

2 个答案:

答案 0 :(得分:2)

来自docs for the join method

  

等到线程终止。这将阻塞调用线程,直到调用join()方法的线程终止 - 正常或通过未处理的异常 - 或直到可选的超时发生。

只需创建一个线程列表,然后在启动每个线程后加入它们。

编辑:

线程并行执行,你可以把python的线程想象成一个单核的计算机,事实是,python的线程最适合IO操作(读/写一个大文件) ,通过套接字发送数据,这种事情)。如果您需要CPU功率,则需要使用multiprocessing module

答案 1 :(得分:-1)

如果python没有GIL,那么你应该能够通过在启动所有线程后将代码更改为仅加入来看到真正的并行性:

threads = []
for each in myList:
  t = threading.Thread(target=mySlowFunc, args=(each,) )
  t.daemon = True
  t.start()
  threads.append(t)
for t in threads:
  t.join()

使用python中的上述代码,你至少应该能够看到交错:线程#2在线程#1完成之前做了一些工作。但是,你不会看到真正的并行性。有关更多背景信息,请参阅GIL链接。