Python语法学习之进程间的通信方式
在多进程编程中,由于每个进程都是独立的执行单元,所以需要进行进程间的通信来实现数据共享或协作完成某项任务。
Python中提供了多种进程间通信的方式,本文将介绍4种常用的进程间通信方式。
管道 (Pipe)
管道是一种基于队列的IPC通信方式,管道提供了一个双向通信的通道,通过该通道可以在两个进程之间传递消息。
下面是一个简单的示例代码:
from multiprocessing import Process, Pipe
def f(conn):
conn.send('hello')
print("child process received message from parent process:", conn.recv())
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print("parent process received message from child process:", parent_conn.recv())
parent_conn.send('world')
p.join()
在上面的例子中,我们创建了两个进程,其中父进程向子进程发送了一个”hello”消息,子进程接受到消息后又向父进程回复了一个”world”消息。
队列 (Queue)
队列是一种基于消息的IPC通信方式,它提供了一个先进先出的消息队列,可用于进程间传递消息。
下面是一个简单的示例代码:
from multiprocessing import Process, Queue
def f(q):
q.put('hello')
print("child process received message from parent process:", q.get())
q.close()
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print("parent process received message from child process:", q.get())
q.put('world')
p.join()
在上面的例子中,我们创建了两个进程,其中父进程向子进程发送了一个”hello”消息,子进程接受到消息后又向父进程回复了一个”world”消息。
共享内存 (Value/Array)
共享内存是一种基于内存映射的IPC通信方式,多个进程可以共享同一块内存区域,这样就可以实现数据共享。
Python中可以使用Value和Array两种方式来创建共享内存对象,其中Value用于存储单个数据,Array用于存储一组数据。
下面是一个简单的示例代码:
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 100
for i in range(len(a)):
a[i] *= 2
if __name__ == '__main__':
num = Value('i', 0)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
在上面的例子中,我们创建了一个Value对象和一个Array对象,父进程向子进程传递了这两个对象,子进程对Value对象进行了修改,对Array对象中的数据进行了批量处理,父进程最终获取了修改后的Value对象的值和修改后的Array对象的数据。
文件 (File)
文件是一种基于文本文件或二进制文件的IPC通信方式,多个进程可以通过读写同一个文件来实现进程间通信。
下面是一个简单的示例代码:
from multiprocessing import Process
def f(file):
with open(file, 'w') as fw:
fw.write('hello')
with open(file, 'r') as fr:
msg = fr.read()
print("child process received message from parent process:", msg)
if __name__ == '__main__':
file = 'test.txt'
p = Process(target=f, args=(file,))
p.start()
with open(file, 'w') as fw:
fw.write('world')
p.join()
在上面的例子中,我们创建了一个子进程,父进程向文件中写入一个”world”消息,子进程读取文件并打印出父进程发送的消息。
以上就是常用的4种进程间通信方式,熟练掌握这些方式可以帮助我们更好的进行多进程编程。