### Python 实现进程同步与通信方法详解 在Python中,多线程的处理方式并非真正意义上的多线程处理,这主要是因为全局解释器锁(Global Interpreter Lock, GIL)的存在,使得多线程无法实现真正的并行计算。为了充分利用多核CPU的性能,通常采用多进程的方式来进行程序设计。Python提供了`multiprocessing`模块,它允许开发者轻松地创建多进程应用,处理复杂的任务分发和数据通信问题。 #### 1. 多进程基础:`Process` 类 `multiprocessing`中最基本的类是`Process`,它可以用来创建新的进程。`Process`类的构造函数接受一个目标函数作为参数,这个函数将在新进程中执行。此外,还可以传入参数列表和其他选项,例如是否立即启动进程等。 示例代码: ```python from multiprocessing import Process import os def run_proc(name): for i in range(5): time.sleep(0.2) print(f'Run child process {name} ({os.getpid()})') if __name__ == '__main__': print(f'Run the main process ({os.getpid()}).') p = Process(target=run_proc, args=('test',)) p.start() p.join() print('Child process done.') ``` 在这个示例中,我们定义了一个名为`run_proc`的函数,它将在子进程中执行。然后,我们创建了一个`Process`实例,并将其启动。`p.join()`确保主进程等待子进程完成后继续执行。 #### 2. 进程间的同步:`Lock` 和 `Semaphore` 在多进程编程中,进程间的数据共享和同步非常重要。Python的`multiprocessing`模块提供了两种常见的同步机制:`Lock` 和 `Semaphore`。 - **Lock**:提供了一种简单的互斥机制,可以确保同一时刻只有一个进程能够访问某个资源。一旦一个进程获得了锁,其他试图获取相同锁的进程将被阻塞,直到持有锁的进程释放锁为止。 示例代码: ```python from multiprocessing import Process, Lock import os import time lock = Lock() def run_proc(name): global lock for i in range(5): time.sleep(0.2) lock.acquire() print(f'Run child process {name} ({os.getpid()})') lock.release() if __name__ == '__main__': print(f'Run the main process ({os.getpid()}).') processes = [Process(target=run_proc, args=(f'Process{i}',)) for i in range(16)] for p in processes: p.start() for p in processes: p.join() print('All subprocesses done.') ``` - **Semaphore**:与`Lock`类似,但可以控制同时访问共享资源的最大数量。例如,如果有3个许可,则最多只能有3个进程同时访问共享资源。 示例代码: ```python from multiprocessing import Process, Semaphore import os import time s = Semaphore(3) def run_proc(name): for i in range(5): time.sleep(0.2) s.acquire() print(f'Run child process {name} ({os.getpid()})') s.release() if __name__ == '__main__': print(f'Run the main process ({os.getpid()}).') processes = [Process(target=run_proc, args=(f'Process{i}',)) for i in range(16)] for p in processes: p.start() for p in processes: p.join() print('All subprocesses done.') ``` #### 3. 进程间通信:`Queue` 和 `Pipe` - **Queue**:`multiprocessing`中的`Queue`类提供了多进程之间的安全通信机制。它可以被多个进程所共享,用于在这些进程之间发送消息。队列是线程安全的,因此可以在不同的进程之间传递数据而不用担心同步问题。 示例代码: ```python from multiprocessing import Process, Queue import os def write(q): q.put('Hello') q.put('World') def read(q): while True: print(f'Read {q.get()} from queue') if __name__ == '__main__': q = Queue() pw = Process(target=write, args=(q,)) pr = Process(target=read, args=(q,)) pw.start() pr.start() pw.join() pr.terminate() ``` - **Pipe**:`Pipe`类可以创建一对连接的管道,用于两个进程之间的双向通信。管道是半双工的,意味着数据只能在一个方向上传输。 示例代码: ```python from multiprocessing import Process, Pipe import os def send(conn): conn.send('Hello') conn.close() def receive(conn): print(f'Received {conn.recv()}') if __name__ == '__main__': parent_conn, child_conn = Pipe() p_send = Process(target=send, args=(child_conn,)) p_receive = Process(target=receive, args=(parent_conn,)) p_send.start() p_receive.start() p_send.join() p_receive.join() ``` 总结来说,`multiprocessing`模块提供了丰富的工具来支持多进程编程,包括进程创建、进程同步和进程间通信。这些工具使得开发者能够轻松地利用多核CPU的性能,并有效地管理多进程应用中的数据流和同步问题。
- 粉丝: 6
- 资源: 928
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助