在编程的浩瀚宇宙中,每个Python进程曾像是一座座孤岛,各自运行在自己的内存空间内,互不相通。然而,随着项目复杂度的提升,进程间的协同工作变得至关重要。幸运的是,Python提供了多种机制,让这些孤岛能够搭起桥梁,形成一片广阔无垠的大陆,实现信息的自由流通。本文将带你探索几种常见的Python进程间通信(IPC)方式,并通过示例代码,展示如何打破隔阂,让代码世界紧密相连。
- 管道(Pipes)
管道是Unix/Linux系统中一种最基本的IPC机制,它允许一个进程(写进程)将数据传输给另一个进程(读进程)。在Python中,可以通过multiprocessing模块中的Pipe()函数来创建管道。
python
from multiprocessing import Process, Pipe
def sender(conn):
conn.send(['hello', 'world'])
conn.close()
def receiver(conn):
print(conn.recv())
conn.close()
if name == 'main':
parent_conn, child_conn = Pipe()
p1 = Process(target=sender, args=(child_conn,))
p2 = Process(target=receiver, args=(parent_conn,))
p1.start()
p2.start()
p1.join()
p2.join()
- 队列(Queues)
队列是另一种常用的IPC机制,它允许多个进程安全地存取数据。Python的multiprocessing.Queue是一个线程和进程安全的队列实现。
python
from multiprocessing import Process, Queue
def worker(q):
q.put('Hello World')
if name == 'main':
q = Queue()
p = Process(target=worker, args=(q,))
p.start()
print(q.get()) # 输出: Hello World
p.join()
- 共享内存(Shared Memory)
对于需要高效传输大量数据的场景,共享内存是理想的选择。Python的multiprocessing.Value和multiprocessing.Array允许进程间共享基本数据类型和数组。
python
from multiprocessing import Process, Value, Lock
def increment(num, lock):
with lock:
num.value += 1
if name == 'main':
lock = Lock()
num = Value('i', 0)
p = Process(target=increment, args=(num, lock))
p.start()
p.join()
print(num.value) # 输出: 1
- 套接字(Sockets)
虽然套接字通常用于网络间通信,但也可以用于同一台机器上的不同进程间通信。Python的socket模块提供了TCP和UDP套接字的支持。
python
import socket
def server():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('localhost', 12345))
s.listen()
conn, addr = s.accept()
with conn:
print(conn.recv(1024).decode())
def client():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(('localhost', 12345))
s.sendall(b'Hello, server!')
if name == 'main':
from threading import Thread
t1 = Thread(target=server)
t2 = Thread(target=client)
t1.start()
t2.start()
t1.join()
t2.join()
通过这些IPC机制,Python进程间不再是孤立的岛屿,而是紧密相连的大陆,共同构建出更加丰富、复杂的程序世界。