使用多处理队列,池和锁定的简单示例

使用多处理队列,池和锁定的简单示例,第1张

使用多处理队列,池和锁定的简单示例

最好的解决方案是利用

Pool
。使用
Queue
s并具有单独的“队列馈送”功能可能会过大。

这是程序的稍微重新排列的版本,这次 只有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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5655674.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存