1. multiprocessing模块概述
multiprocessing
是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。这个模块提供了一个类似于threading
模块的API,但它是基于进程的,而不是基于线程的。因此,它可以充分利用多核CPU的优势,并且由于进程间的内存隔离,它通常比线程更安全。
2. Pipe()
Pipe()
函数用于在进程之间创建管道。管道是一个双向的、基于消息的通信通道,它允许两个进程之间进行数据交换。Pipe()
函数返回一个由两个连接对象组成的元组,这两个对象分别表示管道的两端。
示例代码:
import multiprocessing
def worker(conn):
# 从管道接收数据
data = conn.recv()
print(f"Worker received: {data}")
# 发送数据回管道
conn.send("Hello from worker!")
if __name__ == "__main__":
# 创建一个管道
parent_conn, child_conn = multiprocessing.Pipe()
# 创建一个子进程并传递管道的一端
p = multiprocessing.Process(target=worker, args=(child_conn,))
p.start()
# 向管道发送数据
parent_conn.send("Hello from parent!")
# 从管道接收数据
result = parent_conn.recv()
print(f"Parent received: {result}")
# 等待子进程结束
p.join()
代码解释:
- 我们首先导入了
multiprocessing
模块。 - 定义了一个名为
worker
的函数,该函数接收一个连接对象作为参数。这个函数从管道接收数据,打印它,然后发送一条消息回管道。 - 在主程序中,我们使用
multiprocessing.Pipe()
创建了一个管道,并得到了两个连接对象:parent_conn
和child_conn
。 - 我们创建了一个子进程,并将
child_conn
作为参数传递给worker
函数。这样,子进程就可以通过child_conn
与主进程通信了。 - 在主进程中,我们使用
parent_conn.send()
向管道发送了一条消息。 - 然后,我们使用
parent_conn.recv()
从管道接收子进程发送回来的消息,并打印它。 - 最后,我们使用
p.join()
等待子进程结束。
3. Queue()
Queue()
类是一个线程和进程安全的队列类,用于在进程之间传递数据。它实现了管道和锁定以提供同步。
示例代码:
import multiprocessing
def worker(q):
# 从队列中取出数据并打印
data = q.get()
print(f"Worker received: {data}")
# 将数据放入队列中
q.put("Hello from worker!")
if __name__ == "__main__":
# 创建一个队列
q = multiprocessing.Queue()
# 创建一个子进程并传递队列
p = multiprocessing.Process(target=worker, args=(q,))
p.start()
# 向队列中放入数据
q.put("Hello from parent!")
# 等待队列中的数据被取出
q.get() # 注意:这里只是为了演示,通常不会在主进程中等待子进程的结果
# 等待子进程结束
p.join()
# 从队列中取出子进程放入的数据
result = q.get()
print(f"Parent received: {result}")
代码解释:
- 与
Pipe()
示例类似,我们首先导入了multiprocessing
模块。 - 定义了一个名为
worker
的函数,该函数接收一个队列对象作为参数。这个函数从队列中取出数据,打印它,然后向队列中放入一条消息。 - 在主程序中,我们使用
multiprocessing.Queue()
创建了一个队列对象q
。 - 我们创建了一个子进程,并将队列对象
q
作为参数传递给worker
函数。这样,子进程就可以通过队列与主进程通信了。 - 在主进程中,我们使用
q.put()
向队列中放入了一条消息。 - 注意,在上面的代码中,主进程调用了
q.get()
来等待队列中的数据被取出。这
处理结果:1. multiprocessing模块概述
multiprocessing
是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。这个模块提供了一个类似于threading
模块的API,但它是基于进程的,而不是基于线程的。因此,它可以充分利用多核CPU的优势,并且由于进程间的内存隔离,它通常比线程更安全。2. Pipe()
Pipe()
函数用于在进程之间创建管道。管道是一个双向的、基于消息的通信通道,它允许两个进程之间进行数据交换。Pipe()
函数返回一个由两个连接对象组成的元组,这两个对象分别表示管道的两端。示例代码:
```python
def worker(conn)_从管道接收数据
data = conn.recv()
print(f"Worker received_ {data}")发送数据回管道
conn.send("Hello from worker!")
if name == "main"_创建一个管道
parent_conn, child_conn = multiprocessing.Pipe()创建一个子进程并传递管道的一端
p = multiprocessing.Process(target=worker, args=(child_conn,))
p.start()向管道发送数据
parent_conn.send("Hello from parent!")从管道接收数据
result = parentconn.recv()
print(f"Parent received {result}")等待子进程结束
p.join() - 我们首先导入了
multiprocessing
模块。3. Queue()
Queue()
类是一个线程和进程安全的队列类,用于在进程之间传递数据。它实现了管道和锁定以提供同步。示例代码:
```python
def worker(q)_从队列中取出数据并打印
data = q.get()
print(f"Worker received_ {data}")将数据放入队列中
q.put("Hello from worker!")
if name == "main"_创建一个队列
q = multiprocessing.Queue()创建一个子进程并传递队列
p = multiprocessing.Process(target=worker, args=(q,))
p.start()向队列中放入数据
q.put("Hello from parent!")等待队列中的数据被取出
q.get() # 注意:这里只是为了演示,通常不会在主进程中等待子进程的结果等待子进程结束
p.join()从队列中取出子进程放入的数据
result = q.get()
print(f"Parent received_ {result}") - 与
Pipe()
示例类似,我们首先导入了multiprocessing
模块。