栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

[python] 多进程

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[python] 多进程

multiprocess 官方编程建议

避免共享状态
应该尽可能避免在进程间传递大量数据 越少越好。
最好坚持使用队列或者管道进行进程间通信 而不是底层的同步原语。

可序列化
保证所代理的方法的参数是可以序列化的。

代理的线程安全性
不要在多线程中同时使用一个代理对象 除非你用锁保护它。
而在不同进程中使用 相同 的代理对象却没有问题。

使用 Join 避免僵尸进程
在 Unix 上 如果一个进程执行完成但是没有被 join 就会变成僵尸进程。
一般来说 僵尸进程不会很多 因为每次新启动进程 或者 active_children() 被调用 时 所有已执行完成且没有被 join 的进程都会自动被 join 而且对一个执行完的进程调用 Process.is_alive 也会 join 这个进程。
尽管如此 对自己启动的进程显式调用 join 依然是最佳实践。

僵尸进程是当子进程比父进程先结束 而父进程又没有回收子进程 释放子进程占用的资源 此时子进程将成为一个僵尸进程。

继承优于序列化、反序列化
当使用 spawn 或者 forkserver 的启动方式时 multiprocessing 中的许多类型都必须是可序列化的 这样子进程才能使用它们。但是通常我们都应该避免使用管道和队列发送共享对象到另外一个进程 而是重新组织代码 对于其他进程创建出来的共享对象 让那些需要访问这些对象的子进程可以直接将这些对象从父进程继承过来。

避免杀死进程
听过 Process.terminate 停止一个进程很容易导致这个进程正在使用的共享资源 如锁、信号量、管道和队列 损坏或者变得不可用 无法在其他进程中继续使用。
所以 最好只对那些从来不使用共享资源的进程调用 Process.terminate 。

Join 使用队列的进程
记住 往队列放入数据的进程会一直等待直到队列中所有项被 feeder 线程传给底层管道。 子进程可以调用队列的 Queue.cancel_join_thread 方法禁止这种行为

这意味着

任何使用队列的时候 你都要确保在进程join之前 所有存放到队列中的项将会被其他进程、线程完全消费。否则不能保证这个写过队列的进程可以正常终止。

记住非精灵进程(非Daemon进程)会自动 join 。

下面是一个会导致死锁的例子:

from multiprocessing import Process, Queue
def f(q):
 q.put( X * 1000000)
if __name__ __main__ :
 queue Queue()
 p Process(target f, args (queue,))
 p.start()
 p.join() # this deadlocks
 obj queue.get()

交换最后两行可以修复这个问题 或者直接删掉 p.join() 。

显示传递资源给子进程

在Unix上 使用 fork 方式启动的子进程可以使用父进程中全局创建的共享资源。不过 最好是显式将资源对象通过参数的形式传递给子进程。

除了 部分原因 让代码兼容 Windows 以及其他的进程启动方式外 这种形式还保证了在子进程生命期这个对象是不会被父进程垃圾回收的。如果父进程中的某些对象被垃圾回收会导致资源释放 这就变得很重要。

所以对于实例

from multiprocessing import Process, Lock
def f():
 ... do something using lock ...
if __name__ __main__ :
 lock Lock()
 for i in range(10):
 Process(target f).start()

应当重写成这样

from multiprocessing import Process, Lock
def f(l):
 ... do something using l ...
if __name__ __main__ :
 lock Lock()
 for i in range(10):
 Process(target f, args (lock,)).start()
进程池
from multiprocessing import Pool
from time import sleep
import random
import os
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267466.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号