<p>下面是一个示例程序,它展示了一种方法。其思想是创建一个<code>multiprocessing.Pool</code>来同时运行<code>do_stuff</code>的多个实例。我们还维护一个<code>set</code>来跟踪当前由<code>do_stuff</code>实例处理的所有播放器,这样我们就不会同时处理同一个播放器多次。当<code>do_stuff</code>完成它的工作时,它告诉父进程它已经完成了对播放器的处理,这样就可以处理使用这些播放器的新任务。你知道吗</p>
<pre><code>import time
import multiprocessing
from Queue import Empty
listGames = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
def do_stuff(players):
player1, player2 = players
print("player1 {} player2 {}".format(player1, player2))
time.sleep(5)
# Imagine some other stuff happens here.
print ("now done with {} and {}".format(player1, player2))
q.put((player1, player2))
if __name__ == "__main__":
q = multiprocessing.Queue()
pool = multiprocessing.Pool()
gamesSet = set(listGames) # Convert to a set for efficiency reasons.
running = set() # This keeps track of players being processed.
while gamesSet:
to_remove = []
for player in gamesSet:
if player[0] not in running and player[1] not in running:
running.add(player[0])
running.add(player[1])
pool.apply_async(do_stuff, (player,))
to_remove.append(player)
for player in to_remove:
gamesSet.remove(player)
while True:
# Find out if we're done processing any players.
try:
done = q.get_nowait()
running.remove(done[0])
running.remove(done[1])
except Empty:
break
pool.close()
pool.join()
</code></pre>
<p>输出:</p>
<pre><code>dan@dantop2:~$ ./mult.py
player1 0 player2 1
player1 2 player2 3
now done with 0 and 1
now done with 2 and 3
player1 1 player2 2
player1 0 player2 3
now done with 0 and 3
now done with 1 and 2
player1 1 player2 3
player1 0 player2 2
now done with 1 and 3
now done with 0 and 2
</code></pre>