Python语法学习之进程间的通信方式

  • Post category:Python

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种进程间通信方式,熟练掌握这些方式可以帮助我们更好的进行多进程编程。