当前位置:   article > 正文

Python进程间通信:实现多进程之间的数据交换与共享_python 多进程 通信

python 多进程 通信

        在现代计算机系统中,多进程是一种常见的编程模型,用于实现并发执行和任务分配。然而,多进程之间的数据交换和共享是一个重要的挑战,需要有效的通信机制来实现。Python提供了多种进程间通信的方式,本文将深入探讨这些方式,帮助读者更好地理解和应用Python中的进程间通信。

1. 进程间通信概述

        进程间通信(Inter-Process Communication,IPC)是指多个进程之间交换和共享数据的过程。在多进程编程中,进程间通信至关重要,可以使不同进程之间的数据交换更加灵活高效。

        Python中提供了多种进程间通信的方式,包括管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)和套接字(Socket)等。这些机制各具特点,可根据实际需求选择合适的方法进行进程间通信。

2. 管道(Pipe)        管道是一种简单有效的进程间通信方式,Python中的`multiprocessing`模块提供了`Pipe`类用于创建管道。它可以在父进程和子进程之间传递数据。

  1. from multiprocessing import Process, Pipe
  2. def sender(conn):
  3.     conn.send("Hello from sender")
  4.     conn.close()
  5. def receiver(conn):
  6.     message = conn.recv()
  7.     print(f"Received message: {message}")
  8.     conn.close()
  9. if __name__ == "__main__":
  10.     parent_conn, child_conn = Pipe()
  11.     p1 = Process(target=sender, args=(parent_conn,))
  12.     p2 = Process(target=receiver, args=(child_conn,))
  13.     p1.start()
  14.     p2.start()
  15.     p1.join()
  16.     p2.join()

        在上面的示例中,我们创建了一个管道,将其分为父进程和子进程的两个连接。通过调用`send`和`recv`方法,我们可以在父进程和子进程之间传递消息。这里,父进程通过管道发送了一条消息,子进程接收到消息并进行打印输出。

​​​​​​​

3. 共享内存(Shared Memory)

        共享内存是一种高效的进程间通信方式,它允许共享数据地址空间,从而实现进程之间的数据共享。在Python中,`multiprocessing`模块提供了`Value`和`Array`两个类用于创建共享内存。

  1. from multiprocessing import Process, Value, Array
  2. def writer(num, arr):
  3.     num.value = 10
  4.     for i in range(len(arr)):
  5.         arr[i] = i
  6. def reader(num, arr):
  7.     print(f"Number: {num.value}")
  8.     print(f"Array: {arr[:]}")
  9. if __name__ == "__main__":
  10.     num = Value('d', 0.0)
  11.     arr = Array('i', range(5))
  12.     p1 = Process(target=writer, args=(num, arr))
  13.     p2 = Process(target=reader, args=(num, arr))
  14.     p1.start()
  15.     p2.start()
  16.     p1.join()
  17.     p2.join()

        在上面的示例中,我们创建了一个`Value`对象和一个`Array`对象,分别用于存储一个数值和一个数组。通过这种方式,我们实现了在进程之间共享`num`和`arr`变量。在子进程中,我们修改了共享内存中的值,并在另一个子进程中读取并打印输出。

4. 消息队列(Message Queue)

        消息队列是一种进程间通信的方式,它将数据通过一个中间队列进行传递。Python中的`multiprocessing`模块提供了`Queue`类用于创建消息队列。
 

  1. from multiprocessing import Process, Queue
  2. def sender(queue):
  3.     queue.put("Hello from sender")
  4. def receiver(queue):
  5.     message = queue.get()
  6.     print(f"Received message: {message}")
  7. if __name__ == "__main__":
  8.     queue = Queue()
  9.     p1 = Process(target=sender, args=(queue,))
  10.     p2 = Process(target=receiver, args=(queue,))
  11.     p1.start()
  12.     p2.start()
  13.     p1.join()
  14.     p2.join()

在上面的示例中,我们创建了一个消息队列,通过`put`和`get`方法在父进程和子进程之间传递消息。这里,父进程向消息队列中放入了一条消息,子进程从消息队列中获取并打印输出。

5. 套接字(Socket)

        套接字是一种在网络上实现进程间通信的机制。通过套接字,进程可以在计算机网络上发送和接收数据。Python中的`socket`模块提供了套接字的功能,可以方便地实现进程间通信。

  1. import socket
  2. import os
  3. def sender():
  4.     server_address = '/tmp/sock'
  5.     if os.path.exists(server_address):
  6.         os.remove(server_address)
  7.         
  8.     sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  9.     sock.bind(server_address)
  10.     sock.listen(1)
  11.     while True:
  12.         connection, client_address = sock.accept()
  13.         try:
  14.             connection.sendall(b"Hello from sender")
  15.         finally:
  16.             connection.close()
  17. def receiver():
  18.     server_address = '/tmp/sock'
  19.     sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  20.     sock.connect(server_address)
  21.     received_data = sock.recv(1024)
  22.     print(f"Received data: {received_data}")
  23.     sock.close()
  24. if __name__ == "__main__":
  25.     p1 = Process(target=sender)
  26.     p2 = Process(target=receiver)
  27.     p1.start()
  28.     p2.start()
  29.     p1.join()
  30.     p2.join()

在上面的示例中,我们创建了一个本地套接字,用于进程之间的通信。这里,发送方进程(`sender`)将一条消息发送给接收方进程(`receiver`),接收方进程接收消息并进行打印输出。

不知道人工智能如何学习?不知道单片机如何运作?不知道嵌入式究竟是何方神圣?搞不清楚什么是物联网?遇到问题无人可问?来我的绿泡泡交流群吧!里面有丰富的人工智能资料,帮助你自主学习人工智能相关内容,不论是基础的Python教程、OpenCV教程以及机器学习等,都可以在群中找到;单片机毕设项目、单片机从入门到高阶的详细解读、单片机的一系列资料也备好放入群中!关于嵌入式,我这里不仅仅有嵌入式相关书籍的电子版本,更是有丰富的嵌入式学习资料,100G stm32综合项目实战提升包,70G 全网最全嵌入式&物联网资料包,嵌入式面试、笔试的资料,物联网操作系统FreeRTOS课件源码!群内高手云集,各位大佬能够为您排忧解难,让您在学习的过程中如虎添翼!扫码进群即可拥有这一切!还在等什么?赶快拿起手机,加入群聊吧!扫码进群领资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/798774
推荐阅读
相关标签
  

闽ICP备14008679号