了解python中多个进程的执行顺序和时间

时间:2016-04-24 17:02:12

标签: python multiprocessing

# 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秒后完成吗?

1 个答案:

答案 0 :(得分:0)

  1. 这是因为您正在使用printflush,这是I / O操作,所以它们相对较慢。 因此,当您的工作人员处理完成打印操作时,您的主要流程已在join

  2. 中等待
  3. 同样的道理。更多流程并不总是意味着更快的性能它取决于参数: