一个简单但是困扰我的问题: multiprocessing 多进程处理时,如何将多进程的进程 id 放到一个 list 里面?

2019-09-09 11:35:04 +08:00
 Raul7
pool = Pool(processes=3)
pool.apply_async(self.run, (i,))

比如并发三个进程,在 run 方法里 os.getpid(),可是获得的进程 id 是三个独立的,我该如何将这个三个进程 id 放在一起(一个全局 list 里)?
2276 次点击
所在节点    Python
12 条回复
www5070504
2019-09-09 12:31:23 +08:00
记得多进程库里边提供了一个代理的方法来实现全局 但是性能不咋地.. 要不然试试放缓存里边啊
Raul7
2019-09-09 12:37:24 +08:00
@www5070504 redis ?
lolizeppelin
2019-09-09 12:54:34 +08:00
请把基础打一下
linux 进程间通信,父子进程

回头再来看 multiprocessing 源码
laminux29
2019-09-09 13:00:41 +08:00
主线程伪代码:
准备一个线程安全的 list
准备新线程 1\2\3
新线程 1.run( list )
新线程 2.run( list )
新线程 3.run( list )
Vegetable
2019-09-09 13:22:02 +08:00
```python
import multiprocessing
import os
import time
from multiprocessing import Manager

m = Manager()
lock = multiprocessing.Lock()
pids = m.list()


def show():
print("当前 pid:{}".format(pids))


def dosth():
lock.acquire()
pid = os.getpid()
pids.append(pid)
lock.release()
show()
time.sleep(1)


pool = multiprocessing.Pool(5)

for i in range(10):
pool.apply_async(dosth)
pool.close()
pool.join()

``` 将就一下
Cooky
2019-09-09 13:24:05 +08:00
mmap 共享映射?
Raul7
2019-09-09 14:07:43 +08:00
@lolizeppelin 抱歉老哥 的确新手
Raul7
2019-09-09 14:08:32 +08:00
@Vegetable 嗯嗯 这样是可以将就的 有啥缺陷吗老哥
xiaolinjia
2019-09-09 14:49:41 +08:00
我记得多进程通信可以借助多进程的 Queue 啊
from multiprocessing import Manager
Manager().Queue()
参考 blog.csdn.net/qq_32446743/article/details/79785684
conn4575
2019-09-09 16:33:17 +08:00
Queue+1
Leigg
2019-09-09 16:56:49 +08:00
这个应该想到多进程间的几种通信方式: 队列,共享内存,管道
reus
2019-09-09 17:00:19 +08:00
多进程内存空间是隔离的,所以要么用进程间通讯,要么在主进程 fork/clone 时记录。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/599233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX