首页 > 系统相关 >进程间通信

进程间通信

时间:2023-07-23 17:55:33浏览次数:30  
标签:__ value 间通信 进程 shared array conn

说明

进程间除了主子进程共享数据,也可以通过进程间通信实现交互、数据共享

multiprocessing 提供了多种方式来实现进程间通信,如管道(Pipe)、队列(Queue)和共享内存(Value 和 Array)等。

通过这些机制,不同进程之间可以安全地共享数据或进行通信

 

队列(Queue)

from multiprocessing import Process, Queue


def worker(q):
    data = q.get()
    # 子进程处理/消费,主进程的生产的数据
    print("Received data:", data)  # ['data from main process', 'data from child process']


if __name__ == '__main__':
    q = Queue()
    p = Process(target=worker, args=(q,))
    p.start()
    #  主进程塞进去/生产一个数据
    q.put("Hello from main process")

管道(Pipe)

 1 '''
 2 1. 创建管道对象
 3 使用 Pipe() 函数创建了一个管道对象,返回两个连接对象 parent_conn 和 child_conn。parent_conn 用于从父进程向子进程发送消息,child_conn 用于从子进程接收消息。
 4 
 5 2. 创建发送和接收进程,并传递管道连接对象
 6     分别创建了发送进程 sender_process 和接收进程 receiver_process,并通过参数传递了相应的管道连接对象。这样,这两个进程就可以使用各自的连接对象进行通信。
 7 
 8 3. 启动进程
 9     使用 start() 方法启动发送和接收进程,它们会并行地执行任务。
10 
11 4. 等待进程结束
12     使用 join() 方法阻塞等待发送和接收进程结束。这样,主进程会等待子进程完成任务后再继续执行。
13 
14 在具体的任务函数中,sender() 函数使用 conn.send() 方法向管道发送一条消息 "Hello from sender",然后关闭连接。receiver() 函数使用 conn.recv() 方法接收来自管道的消息,并打印出来,然后关闭连接。
15 '''
16 from multiprocessing import Process, Pipe
17 
18 
19 def sender(conn):
20     message = "Hello from sender"
21     conn.send(message)
22     conn.close()
23 
24 
25 def receiver(conn):
26     message = conn.recv()
27     print("Received message:", message) # Received message: Hello from sender
28  conn.close() 29 30 31 if __name__ == '__main__': 32 # 1. 创建管道对象 33 parent_conn, child_conn = Pipe() 34 35 # 2. 创建发送和接收进程,并传递管道连接对象 36 sender_process = Process(target=sender, args=(parent_conn,)) 37 receiver_process = Process(target=receiver, args=(child_conn,)) 38 39 # 3. 启动进程 40  sender_process.start() 41  receiver_process.start() 42 43 # 4. 等待进程结束 44  sender_process.join() 45 receiver_process.join()

 

进程间通信共享内存(Value 和 Array)

Value

 1 '''
 2 在多进程编程中,可以使用 Value 和 Array 来实现进程间共享内存的通信
 3 Value 类用于在进程间共享单个值,它是基于 ctypes 模块实现的。Value 可以通过指定的数据类型来创建共享变量,支持整型、浮点型和自定义的 ctypes 数据类型。
 4 '''
 5 from multiprocessing import Process, Value
 6 
 7 
 8 def worker(shared_value):
 9     shared_value.value = 100
10 
11 
12 if __name__ == '__main__':
13     # 创建共享值对象,初始值为0
14     shared_value = Value('i', 0)
15 
16     # 创建子进程,并传递共享值对象
17     p = Process(target=worker, args=(shared_value,))
18     p.start()
19     p.join()
20 
21     # 打印共享值对象的值
22     print(shared_value.value)  # 100

使用 Value('i', 0) 创建了一个共享的整型值对象 shared_value,初始值为0。然后,我们创建了一个子进程 p,并将 shared_value 作为参数传递给子进程的任务函数 worker。在子进程中,我们将 shared_value.value 设置为100。

最后,在主进程中,我们打印了 shared_value.value 的值,可以看到它已经被子进程修改为100。

Array

 1 '''
 2 Array 类用于在进程间共享可变数组,它也是基于 ctypes 模块实现的。Array 可以通过指定的数据类型和大小来创建共享数组,支持整型、浮点型和自定义的 ctypes 数据类型。
 3 '''
 4 
 5 from multiprocessing import Process, Array
 6 
 7 
 8 def worker(shared_array):
 9     for i in range(len(shared_array)):
10         shared_array[i] = i * 2  # 给array添加元素
11 
12 
13 if __name__ == '__main__':
14     # 创建共享数组对象,大小为5
15     shared_array = Array('i', 5)
16 
17     # 创建子进程,并传递共享数组对象
18     p = Process(target=worker, args=(shared_array,))
19     p.start()
20     p.join()
21 
22     # 打印共享数组对象的值
23     print(list(shared_array))  # [0, 2, 4, 6, 8],需要转换为list
24     print(shared_array)  # <SynchronizedArray wrapper for <multiprocessing.sharedctypes.c_long_Array_5 object at 0x000001E86912FB50>>

 使用 Array('i', 5) 创建了一个包含5个整型元素的共享数组对象 shared_array。然后,我们创建了一个子进程 p,并将 shared_array 作为参数传递给子进程的任务函数 worker。在子进程中,我们将 shared_array 的每个元素设置为索引乘以2的值。

标签:__,value,间通信,进程,shared,array,conn
From: https://www.cnblogs.com/allenxx/p/17575329.html

相关文章

  • 创建进程
    创建进程步骤1.导入进程包importmultiprocessing2.通过进程类创建进程对象进程对象=multiprocessing.Process()#是Process类3.启动进程执行任务进程对象.start() 示例1#1.导入多进程模块2importmultiprocessi......
  • android 双进程保活
    Android双进程保活在Android应用开发中,为了提供更好的用户体验,保证应用的稳定性和持久运行,我们常常需要保持应用进程的活跃状态。其中,双进程保活是一种常用的方式,本文将介绍如何通过双进程保活来实现应用的长时间运行。什么是双进程保活双进程保活是指通过启动一个后台进程来保......
  • dockercompose 容器服务之间通信
    DockerCompose容器服务之间通信DockerCompose是一个用于定义和运行多容器Docker应用程序的工具。通过DockerCompose,我们可以使用YAML文件来定义多个容器的配置和连接方式。在DockerCompose中,容器之间的通信非常重要,因为它们可能需要相互协作来完成复杂的任务。在本......
  • 进程实现多任务(进程概念、单进程、多进程执行多任务)
    在Python程序中,想要实现多任务可以使⽤进程来完成,进程是实现多任务的⼀种⽅式。属于CPU密集型的任务。进程的概念进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位 ⼀个正在运⾏的程序或者软件至少有⼀个进程,也就是说每启动⼀个进程,操作系统都......
  • windows是使用命令kill进程
    参考:https://blog.csdn.net/zaizuxuan/article/details/126950788根据进程名找到进程例如python进程PSC:\Users\27467>tasklist|findstrpythonpython.exe7088Console23,364Kpython.exe1580Cons......
  • tivation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
    困扰我大半年的错误,今天偶然间被解决了,特此分享给被同样问题纠结的朋友们!之前的求助帖,无人应答:http://www.cnblogs.com/freeton/archive/2012/08/28/2660585.htmlhttp://bbs.csdn.net/topics/391988642症状日志中大量报错,IIS严重错误,此类错误默认情况下5分钟连续出现5次会......
  • php与 redis的队列 && 如何守护进程?
    在PHP中,使用队列可以解决以下情况下的一些常见问题:异步任务处理:当应用程序需要处理一些耗时的任务,如发送电子邮件、生成报表、处理文件上传等,可以将这些任务添加到队列中,并使用队列进行异步处理,从而不影响主要的用户请求处理。消息通信:在分布式系统或微服务......
  • 向进程发送信号
    如果我们写了一个程序,监听特定信号,完成某些动作,如何向进程发送这个系统信号呢。kill-SIGUSR11234向进程id是1234的发送SIGUSR1信号kill并不是杀死某个进程,只不过默认会发送一些中断信号,也可以通过它发送一些其他信号。具体有哪些信号,也可以通过kill查询。......
  • Linux 网络基础 2 三次握手 三次挥手 多进程 多线程服务器
    1.包裹函数对服务器客户端等函数进行报错处理以及简化处理比如bindinttcp4bind(shortport,constchar*IP){structsockaddr_inserv_addr;intlfd=Socket(AF_INET,SOCK_STREAM,0);bzero(&serv_addr,sizeof(serv_addr));if(IP==NULL){//......
  • Linux ps -o 查看进程启动时间
    时间参数如下表参数 含义start显示进程启动时间的简短格式。通常,它会显示日期时间中的月-日或者时-分-秒start_time 显示进程启动时间的简短格式,通常格式是年或者 月-日或者 时-分,没有秒etime显示进程启动的累积时间,通常格式是天-时-分-秒......