# from
#https://pymotw.com/2/multiprocessing/basics.htmlimport multiprocessing
import multiprocessing
import time
import logging
import sys
def worker(num):
"""thread worker function"""
starttime = time.time()
print '------***---WORKER ALERT: ', num, ' started', starttime
print '------***---Doing some work'
sys.stdout.flush()
for i in range(100000):
for j in range(10000):
pass
endtime = time.time()
print '------***----***------WORKER TIME ',num,' : Time Taken = ', endtime - starttime
sys.stdout.flush()
return
start_time = time.time()
if __name__ == '__main__':
multiprocessing.log_to_stderr(logging.DEBUG)
jobs = []
for i in range(1,7):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
print '-------MAIN ALERT: process\t',p,' started', time.time()
sys.stdout.flush()
for j in jobs:
print '------------------going to run JOIN\t',j
sys.stdout.flush()
j.join()
print '------------------JOINED %s.exitcode = %s' % (j.name, j.exitcode)
print '------------------JOINED Time : {}'.format(time.time() - start_time)
sys.stdout.flush()
p.join()
print '====================JOINED\t',p
终端输出为here有6名工人,大约需要30秒。
在我的笔记本电脑上(macbook pro quad core i7),事件的起始顺序为:
1)主要警告
2)调试信息
3)工人警告
接近结束时,我看到一个加入开始? (就在最后一个流程开始之前)如果一个连接确实被调用了,为什么工人会继续产生?我确保使用
sys.stdout.flush()
因此终端缓冲区和屏幕之间没有缓冲延迟。那么这意味着联接确实开始了,但是这些过程仍然存在吗?
程序以
组结尾1)工人时间计算
2)更多DEBUG信息
加入命令及其执行时间以无特定顺序结束。这些连接继续穿插着工人时间计算和调试信息的组。
如果连接块执行,那么为什么我看不到组的有序输出 1)加入时间计算
2)DEBUG关闭信息
3)工人时间计算
另外,如果我用2名工人执行,则需要约22秒,6名工人~33秒,10名工人~44秒,12名工人~65秒。如果我有一个超线程四核CPU(8核?)并且没有超过我的核心数,为什么需要2到6名工作人员呢?我想我理解为什么10名工人需要40秒 - 工人8和9必须等待前两个核心变得自由 - 大约20秒。但那为什么我要为12名工人需要65秒呢?如果第一批核心在大约22秒后全部释放,那么第二批核心应该在44秒后完成吗?
答案 0 :(得分:0)
这是因为您正在使用print
和flush
,这是I / O操作,所以它们相对较慢。
因此,当您的工作人员处理完成打印操作时,您的主要流程已在join
同样的道理。更多流程并不总是意味着更快的性能它取决于参数:
计算机上的核心数
任务类型 - I / O有界或CPU有界(请在此处查看: What do the terms "CPU bound" and "I/O bound" mean?)