簡體   English   中英

Python多處理進程ID

[英]Python multiprocessing Process ID

我正在使用multiprocessing.Pool也運行不同的進程(例如4個進程),我需要標識每個進程,以便在每個進程中可以做不同的事情。

因為池在while循環內運行,所以對於第一次迭代,我可以知道每個進程的ID,但是對於第二次或更多次迭代,此ID會更改,或者至少我找不到一個看起來相同的屬性所有迭代中的每個過程。

該代碼的相關部分如下:

     while i <= maxiter:
        print('\n' + 'Iteration: %r'%i + '\n')

        pool = mp.Pool(processes = numprocs)

        swarm = pool.map_async(partial(proxy, costf = costFunc, i=i),Swarm)
        pool.close()
        pool.join()

        Swarm = swarm.get()

我嘗試使用以下屬性來正確標識進程,但對我而言不起作用:

print(mp.Process().name)
print(mp.current_process().name)

有了這個輸出是:

Iteration: 1

Process-2:1
Process-1:1
ForkPoolWorker-1
ForkPoolWorker-2
Process-3:1
ForkPoolWorker-3
Process-2:2
ForkPoolWorker-2
Process-3:2
Process-2:3
ForkPoolWorker-3
ForkPoolWorker-2
Process-1:2
ForkPoolWorker-1
Process-4:1
Process-3:3
ForkPoolWorker-4
ForkPoolWorker-3
Process-2:4
ForkPoolWorker-2

Iteration: 2

Process-5:1
ForkPoolWorker-5
Process-5:2
Process-7:1
ForkPoolWorker-7
Process-6:1
ForkPoolWorker-5
ForkPoolWorker-6
Process-5:3
ForkPoolWorker-5
Process-7:2
ForkPoolWorker-7
Process-5:4
ForkPoolWorker-5
Process-6:2
ForkPoolWorker-6
Process-7:3
ForkPoolWorker-7
Process-8:1
ForkPoolWorker-8

有什么想法可以每次以相同的方式標識每個進程嗎?

編輯1:

我已經將程序簡化為這個,但是想法是一樣的:

import random, numpy as np,time
import multiprocessing as mp

def costFunc(i):
    print(mp.current_process().name,mp.Process().name)
    return i*1

class PSO():
    def __init__(self,maxiter,numprocs):

        # Begin optimization Loop
        i = 1
        self.Evol = []

        while i <= maxiter:
            print('\n' + 'Iteration: %r'%i + '\n')
            pool = mp.Pool(processes = numprocs)
            swarm = pool.map_async(costFunc,(i,))
            pool.close()
            pool.join()

            Swarm = swarm.get()

            i += 1

if __name__ == "__main__":
    #mp.set_start_method('spawn')
    PSO(10,1)

OUTPUT:

Iteration: 1
ForkPoolWorker-1 Process-1:1
Iteration: 2
ForkPoolWorker-2 Process-2:1
Iteration: 3
ForkPoolWorker-3 Process-3:1
Iteration: 4
ForkPoolWorker-4 Process-4:1
Iteration: 5
ForkPoolWorker-5 Process-5:1
Iteration: 6
ForkPoolWorker-6 Process-6:1
Iteration: 7
ForkPoolWorker-7 Process-7:1
Iteration: 8
ForkPoolWorker-8 Process-8:1
Iteration: 9
ForkPoolWorker-9 Process-9:1
Iteration: 10
ForkPoolWorker-10 Process-10:1

您將在循環的每次迭代中創建一個新池,因此池中的進程永遠不會被重復使用。

pool = mp.Pool(processes = numprocs) (以及pool.close()pool.join() )移出while循環,以重新使用池中的進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM