美文网首页
python进程池

python进程池

作者: caelansar | 来源:发表于2018-01-30 20:51 被阅读0次

近日学习python的多进程,遇到了一个坑,在此记录一下。
代码如下:

from multiprocessing import Manager, Pool, Lock

def worker(l):
    for i in range(5):
        l.append(i)
    print(l)

def callback(arg):
    print('......exec done ')

if __name__ == '__main__':
    pool = Pool()
    m = Manager()
    l = m.list()
    for _ in range(4):
        pool.apply_async(worker, args=(l,), callback=callback)
    pool.close()
    pool.join()
    print('Main Process End.')

其中一次输出:

[0, 1, 2, 3, 0, 4, 1]
......exec done: 
[0, 1, 2, 3, 0, 4, 1, 2, 3, 0, 4]
......exec done: 
[0, 1, 2, 3, 0, 4, 1, 2, 3, 0, 4, 1, 2, 3, 0, 4, 1]
......exec done: 
[0, 1, 2, 3, 0, 4, 1, 2, 3, 0, 4, 1, 2, 3, 0, 4, 1, 2, 3, 4]
......exec done: 
Main Process End.

emmm....好像哪里有些不对....
于是就想到了加锁,修改代码如下:

def worker(l, lock):
    with lock:
        for i in range(5):
            l.append(i)
        print(l)
....
if __name__ == '__main__':
    pool = Pool()
    m = Manager()
    l = m.list()
    lock = Lock()
    for _ in range(4):
        pool.apply_async(worker, args=(l,lock), callback=callback)
    pool.close()
    pool.join()
    print('Main Process End.')

结果发现程序直接就执行了最后一句print('Main Process End.')...
查了一下发现似乎要用Manage,再次修改代码将lock = Lock()替换为lock=m.Lock()

[0, 1, 2, 3, 4]
......exec done: 
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
......exec done: 
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
......exec done: 
[0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
......exec done: 
Main Process End.

这次执行结果就和我们想要的一样了。

相关文章

  • python学习-线程、进程简洁使用

    python的线程池和进程池很pythonic 进程 from multiprocessing import Po...

  • python使用ProcessPoolExecutor问题总结

    python版本:3.7.10 进程池启动需要从主进入__name__=="__mian__' 进程池的futur...

  • 使用池来实现并发服务器

    python自带池 进程池和线程池创建用的是同一个模块(multiprocessing),但方法不同,进程池的方法...

  • python笔记3

    python 无线程池 ,有进程池 阻塞 意外着等待子进程结束 字典的无序性 : 进程,线程,协程 协程,又称微...

  • python进程池

    串行进程池: 并行进程池: 在并行池中必须先close再join,不然打印end后就直接结束了,进程池中的进程还未...

  • python进程池

    近日学习python的多进程,遇到了一个坑,在此记录一下。代码如下: 其中一次输出: emmm....好像哪里有些...

  • Python 进程池

    当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果...

  • python 进程池

    进程池 当我们创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成,但是同...

  • Python进程池

    进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生...

  • python进程池

    详细参考[https://liwt31.github.io/2021/05/29/pool/]

网友评论

      本文标题:python进程池

      本文链接:https://www.haomeiwen.com/subject/fjchzxtx.html