最好的解决方案是利用
Pool。使用
Queues并具有单独的“队列馈送”功能可能会过大。
这是程序的稍微重新排列的版本,这次 只有2个进程 包含在中
Pool。我相信这是最简单的方法,只需对原始代码进行最少的更改即可:
import multiprocessingimport timedata = ( ['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'], ['e', '1'], ['f', '3'], ['g', '5'], ['h', '7'])def mp_worker((inputs, the_time)): print " Processs %stWaiting %s seconds" % (inputs, the_time) time.sleep(int(the_time)) print " Process %stDONE" % inputsdef mp_handler(): p = multiprocessing.Pool(2) p.map(mp_worker, data)if __name__ == '__main__': mp_handler()
请注意,该
mp_worker()函数现在接受一个参数(前两个参数的一个元组),因为该
map()函数将您的输入数据分块为子列表,每个子列表都作为一个单独的参数提供给worker函数。
输出:
Processs a Waiting 2 secondsProcesss b Waiting 4 secondsProcess a DonEProcesss c Waiting 6 secondsProcess b DonEProcesss d Waiting 8 secondsProcess c DonEProcesss e Waiting 1 secondsProcess e DonEProcesss f Waiting 3 secondsProcess d DonEProcesss g Waiting 5 secondsProcess f DonEProcesss h Waiting 7 secondsProcess g DonEProcess h DONE
根据下面的@Thales评论进行编辑:
如果要“为每个池限制加锁”,以便您的进程成对运行,ala:
A等待B等待| A完成,B完成| C等待D等待 C完成,D完成| …
然后更改处理程序功能以为每对数据启动(2个进程的)池:
def mp_handler(): subdata = zip(data[0::2], data[1::2]) for task1, task2 in subdata: p = multiprocessing.Pool(2) p.map(mp_worker, (task1, task2))
现在您的输出是:
Processs a Waiting 2 seconds Processs b Waiting 4 seconds Process a DONE Process b DONE Processs c Waiting 6 seconds Processs d Waiting 8 seconds Process c DONE Process d DONE Processs e Waiting 1 seconds Processs f Waiting 3 seconds Process e DONE Process f DONE Processs g Waiting 5 seconds Processs h Waiting 7 seconds Process g DONE Process h DONE
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)