V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Raul7
V2EX  ›  Python

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

  •  
  •   Raul7 · 2019-09-09 11:35:04 +08:00 · 2339 次点击
    这是一个创建于 1903 天前的主题,其中的信息可能已经有所发展或是发生改变。
    pool = Pool(processes=3)
    pool.apply_async(self.run, (i,))

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

    回头再来看 multiprocessing 源码
    laminux29
        4
    laminux29  
       2019-09-09 13:00:41 +08:00
    主线程伪代码:
    准备一个线程安全的 list
    准备新线程 1\2\3
    新线程 1.run( list )
    新线程 2.run( list )
    新线程 3.run( list )
    Vegetable
        5
    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
        6
    Cooky  
       2019-09-09 13:24:05 +08:00 via Android
    mmap 共享映射?
    Raul7
        7
    Raul7  
    OP
       2019-09-09 14:07:43 +08:00
    @lolizeppelin 抱歉老哥 的确新手
    Raul7
        8
    Raul7  
    OP
       2019-09-09 14:08:32 +08:00
    @Vegetable 嗯嗯 这样是可以将就的 有啥缺陷吗老哥
    xiaolinjia
        9
    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
        10
    conn4575  
       2019-09-09 16:33:17 +08:00 via Android
    Queue+1
    Leigg
        11
    Leigg  
       2019-09-09 16:56:49 +08:00 via Android
    这个应该想到多进程间的几种通信方式: 队列,共享内存,管道
    reus
        12
    reus  
       2019-09-09 17:00:19 +08:00
    多进程内存空间是隔离的,所以要么用进程间通讯,要么在主进程 fork/clone 时记录。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2479 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:19 · PVG 08:19 · LAX 16:19 · JFK 19:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.