Python:理解线程模块

-1 投票
2 回答
724 浏览
提问于 2025-04-17 22:23

在学习Python的threading模块时,我做了一个简单的测试。发现这些线程是顺序执行的,而不是并行的。有没有办法修改这个测试代码,让程序像多进程那样并行执行线程呢?

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 个回答

-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()

用上面的代码,你至少能看到线程交替执行的情况:线程#2在线程#1完成之前做了一些工作。但是,你不会看到真正的并行处理。想了解更多背景知识,可以看看GIL的链接。

2

来自join方法的文档

等待线程结束。这会让调用这个方法的线程停下来,直到被调用的线程结束——无论是正常结束还是因为没有处理的错误结束——或者直到你设定的可选超时时间到了。

只需要创建一个线程的列表,然后在启动每个线程后把它们都连接起来。

编辑:

这些线程是同时执行的,你可以把Python的线程想象成一台只有一个核心的电脑。需要注意的是,Python的线程最适合处理IO操作(比如读取/写入大文件、通过网络发送数据等等)。如果你想要更强的计算能力,就需要使用多进程模块

撰写回答