python 进程间通信效率_(1)进程间几种通信方式

管道、消息队列、共享内存、信号量、信号、socket

要知道管道、消息队列、共享内存的本质:内存本质、效率以及传输数据要求,各种使用方式

一、管道

管道通信效率低,不适合进程间频繁地交换数据。好处,简单,很容易得知已被另一进程读

匿名管道,通信范围存在父子关系进程。没有管道文件,只能 fork 复制父进程 fd 文件描述符来通信

命名管道,不相关进程间也能相互通信。因为命令管道,提前创建管道类型设备文件,只要用这个文件,就可通信

相同:都在缓存内核中读写,先进先出,不支持 lseek 之类文件定位操作

1、匿名管道

$ ps auxf | grep mysql       用完就销毁

|就是一个管道,将前一个命令(ps auxf)输出,作为后一命令(grep mysql)输入,管道传数据是单向,如相互通信,要两个

2、命名管道FIFO

$ mkfifo myPipe(名)       用前要mkfifo 命令创建,指定管道名,数据先进先出

1)基于“Linux一切皆文件”,管道也文件,ls 看,文件类型是 p,就是 pipe(管道) 意思

2)往 myPipe 写入数据:因为内容没被读,只有读后,命令才正常退出

3)读出了,echo 命令正常退出

3、创建原理

1)匿名管道创建, 通过  int  pipe(intfd[2]) 系统调用:

两个描述符:管道读取端 fd[0],写入端 fd[1]。ps:匿名管道是特殊文件,只在内存,不存文件系统

2)管道,就是内核里一串缓存。读写都在缓存内核中,传数据是无格式的流且大小受限

3)跨进程通信实现:fork 创建子进程,复制父进程文件描述符,两个进程各有两个「 fd[0] 与 fd[1]」,通过各自fd 读写同一管道文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,进程间通信可以通过多种方式实现。其中一种方法是使用 Python 的 `multiprocessing` 库中的 `Queue` 类。这个类可以创建一个共享的队列,多个进程可以将数据放入队列中,也可以从队列中取出数据。 下面是一个简单的示例代码,展示了如何使用 `Queue` 类进行进程间通信: ```python from multiprocessing import Process, Queue def worker(q): # 从队列中取出一个数据 data = q.get() # 处理数据 result = process_data(data) # 将处理结果放入队列中 q.put(result) if __name__ == '__main__': # 创建一个队列 q = Queue() # 创建两个进程,并启动它们 p1 = Process(target=worker, args=(q,)) p2 = Process(target=worker, args=(q,)) p1.start() p2.start() # 向队列中放入数据 q.put(data1) q.put(data2) # 等待进程结束 p1.join() p2.join() # 从队列中取出处理结果 result1 = q.get() result2 = q.get() ``` 在上面的代码中,我们使用了 `Queue` 类创建了一个共享的队列,然后创建了两个进程 `p1` 和 `p2`,并传入了队列作为参数。这两个进程可以从队列中取出数据并处理,也可以将处理结果放入队列中。主进程 ### 回答2: 进程间通信是指不同进程进行数据交换或共享资源的一种机制。Python提供了多种用于实现进程间通信的方法,以下是几种常见的方式: 1. 管道(Pipe):管道是一种单向的通信方式,可以在父进程和子进程进行通信。可以使用`multiprocessing`模块中的`Pipe()`函数创建管道,并使用`send()`和`recv()`方法在进程发送和接收数据。 ```python from multiprocessing import Process, Pipe def sender(conn): conn.send('Hello') conn.close() def receiver(conn): msg = conn.recv() print(msg) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p1 = Process(target=sender, args=(child_conn,)) p2 = Process(target=receiver, args=(parent_conn,)) p1.start() p2.start() p1.join() p2.join() ``` 2. 队列(Queue):队列是一种多进程共享的数据结构,可以在多个进程进行安全的数据传输。可以使用`multiprocessing`模块中的`Queue()`函数创建队列,并使用`put()`和`get()`方法在进程发送和接收数据。 ```python from multiprocessing import Process, Queue def sender(queue): queue.put('Hello') def receiver(queue): msg = queue.get() print(msg) if __name__ == '__main__': queue = Queue() p1 = Process(target=sender, args=(queue,)) p2 = Process(target=receiver, args=(queue,)) p1.start() p2.start() p1.join() p2.join() ``` 3. 共享内存(Shared Memory):共享内存是一种多进程共享内存空的方式。可以使用`multiprocessing`模块中的`Value`和`Array`函数创建共享内存,多个进程可以直接读写共享内存中的数据。 ```python from multiprocessing import Process, Value, Array def writer(val, arr): val.value = 1 for i in range(len(arr)): arr[i] = i def reader(val, arr): print(val.value) print(arr[:]) if __name__ == '__main__': value = Value('i', 0) array = Array('i', range(10)) p1 = Process(target=writer, args=(value, array)) p2 = Process(target=reader, args=(value, array)) p1.start() p2.start() p1.join() p2.join() ``` 以上是几种常见的实现进程间通信的方式,根据实际需求选择合适的方法来进行进程的数据交换和资源共享。 ### 回答3: 进程间通信是指不同进程传递数据或者共享资源的过程。Python提供了多种方式实现进程间通信,下面我将分别介绍两种常用的方法。 1. 管道(Pipe):管道是一种单向的通信方式,可以用于父子进程或者兄弟进程的通信。在Python中,可以使用`multiprocessing`模块的`Pipe`函数实现管道通信。下面是一个简单的示例代码: ```python from multiprocessing import Process, Pipe def child(conn): data = conn.recv() print("子进程收到消息:", data) conn.send("Hello, 父进程!") def main(): parent_conn, child_conn = Pipe() p = Process(target=child, args=(child_conn,)) p.start() parent_conn.send("Hello, 子进程!") data = parent_conn.recv() print("父进程收到消息:", data) p.join() if __name__ == '__main__': main() ``` 2. 队列(Queue):队列是一种多进程通信的方式,可以在多个进程直接传递数据。Python中的`multiprocessing`模块提供了`Queue`类,可以在进程安全地传递数据。下面是一个简单的示例代码: ```python from multiprocessing import Process, Queue def child(queue): data = queue.get() print("子进程收到消息:", data) queue.put("Hello, 父进程!") def main(): queue = Queue() p = Process(target=child, args=(queue,)) p.start() queue.put("Hello, 子进程!") data = queue.get() print("父进程收到消息:", data) p.join() if __name__ == '__main__': main() ``` 以上就是我对进程间通信的回答,分别使用管道和队列实现了进程的数据传递。在实际应用中,可以根据具体需求选择合适的通信方式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值