multiprocessing
multiprocessing
是一个用与 threading
模块相似API的支持产生进程的包。 multiprocessing
包同时提供本地和远程并发,使用子进程代替线程,有效避免 Global Interpreter Lock(GIL)带来的影响。因此, multiprocessing
模块允许程序员充分利用机器(Unix 或 Windows)上的多个核心。
multiprocessing.Process
multiprocessing.Process
类提供了与threading.Thread
类类似的API:通过创建一个 Process
对象然后调用它的 start()
方法来生成进程。
class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
应始终使用关键字参数调用构造函数。 group 应该始终是 None
;它仅用于兼容 threading.Thread
。 target是由 run()
方法调用的可调用对象。它默认为 None
,意味着什么都没有被调用。 name 是进程名称。 args 是目标调用的参数元组。 kwargs 是目标调用的关键字参数字典。进程 daemon
标志设置为 True
或 False
代表是否为守护进程。如果是 None
(默认值),则该标志将从创建的进程继承。
Process类属性或方法:
- run():表示进程活动的方法。
- satrt():启动进程活动。
- join([timeout]):如果可选参数 timeout 是
None
(默认值),则该方法将阻塞,直到调用join()
方法的进程终止。如果 timeout 是一个正数,它最多会阻塞 timeout 秒。请注意,如果进程终止或方法超时,则该方法返回None
。 - name:进程名称;
- is_alive():进程是否还活着;
- daemon:进程的守护标志,一个布尔值。
- pid:返回进程ID。在生成该进程之前,这将是
None
。 - terminate():终止进程。
- kill():与terminate()相同。
import multiprocessing
def process_job(name):
print("Hi,{}".format(name))
if __name__ == '__main__':
print("Create Process.")
p = multiprocessing.Process(target=process_job, args=("Tom",))
p.start()
p.join()
print("Finished!")
Queue & Pipe
使用多进程时,一般使用消息机制实现进程间通信,尽可能避免使用同步原语(例如锁)。
消息机制包含: Pipe()
(可以用于在两个进程间传递消息),以及队列(能够在多个生产者和消费者之间通信)。
-
multiprocessing.Pipe([duplex])
返回一对
Connection
对象(conn1, conn2)
, 分别表示管道的两端;如果 duplex 被置为True
(默认值),那么该管道是双向的。如果 duplex 被置为False
,那么该管道是单向的,即conn1
只能用于接收消息,而conn2
仅能用于发送消息。示例:返回的两个连接对象 表示管道
Pipe()
的两端,每个连接对象都有send()
和recv()
方法。import multiprocessing def send(conn): conn.send("Good Evening, Father.") conn.close() def main(): parent_conn