擅长:python、mysql、java
<p>您可以使用<code>multiprocessing.Queue</code>来存储id,然后在池进程初始化时获取id。</p>
<p>优点:</p>
<ul>
<li>你不需要依赖内部。</li>
<li>如果您的用例是管理资源/设备,那么您可以直接输入设备号。这也将确保没有设备被使用两次:如果池中的进程多于设备,则附加进程将在<code>queue.get()</code>上阻塞,并且不会执行任何工作(这不会阻塞porgram,或者至少在我测试时不会)。</li>
</ul>
<p>缺点:</p>
<ul>
<li>你有额外的通信开销和产生池
进程需要稍长的时间:没有
示例所有工作都可以由第一个流程执行,就像其他流程一样
尚未完成初始化。</li>
<li>你需要一个全球性的(或者至少我
不知道该怎么办)</li>
</ul>
<p>示例:</p>
<pre><code>import multiprocessing
from time import sleep
def init(queue):
global idx
idx = queue.get()
def f(x):
global idx
process = multiprocessing.current_process()
sleep(1)
return (idx, process.pid, x * x)
ids = [0, 1, 2, 3]
manager = multiprocessing.Manager()
idQueue = manager.Queue()
for i in ids:
idQueue.put(i)
p = multiprocessing.Pool(8, init, (idQueue,))
print(p.map(f, range(8)))
</code></pre>
<p>输出:</p>
<pre><code>[(0, 8289, 0), (1, 8290, 1), (2, 8294, 4), (3, 8291, 9), (0, 8289, 16), (1, 8290, 25), (2, 8294, 36), (3, 8291, 49)]
</code></pre>
<p>注意,虽然池包含8个进程,并且一个idx仅由一个进程使用,但只有4个不同的pid。</p>