首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python多处理进程ID

Python多处理进程ID
EN

Stack Overflow用户
提问于 2018-05-04 10:57:29
回答 1查看 5.9K关注 0票数 1

我也使用multiprocessing.Pool运行不同的进程(例如4个进程),我需要标识每个进程,这样我就可以在每个进程中执行不同的事情。

由于我在while循环中运行了池,对于第一个迭代,我可以知道每个进程的ID,但是对于第二个或更多的迭代,这个ID更改了,或者至少我找不到每个进程在所有迭代中似乎相同的一个属性。

守则的有关部分如下:

代码语言:javascript
复制
     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()

我尝试使用以下属性来正确标识进程,但它并不适用于我:

代码语言:javascript
复制
print(mp.Process().name)
print(mp.current_process().name)

这样,输出是:

代码语言:javascript
复制
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:

我已经将程序简化为这样,但想法是相同的:

代码语言:javascript
复制
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)

产出:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-04 12:34:31

您将在循环的每次迭代中创建一个新池,因此池中的进程永远不会被重用。

pool = mp.Pool(processes = numprocs) (以及pool.close()pool.join())从while循环中移出,以重用池中的进程。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50173344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档