深入Python多进程通信原理与实战——图文

继上节使用原生多进程并行运行,基于Redis作为消息队列完成了圆周率的计算,本节我们使用原生操作系统消息队列来替换Redis。

文件

使用文件进行通信是最简单的一种通信方式,子进程将结果输出到临时文件,父进程从文件中读出来。文件名使用子进程的进程id来命名。进程随时都可以通过os.getpid()来获取自己的进程id。

640?wx_fmt=png
# coding: utf-8

import os
import sys
import math


def slice(mink, maxk):
    s = 0.0
    for k in range(mink, maxk):
        s += 1.0/(2*k+1)/(2*k+1)
    return s


def pi(n):
    pids = []
    unit = n / 10
    for i in range(10):  # 分10个子进程
        mink = unit * i
        maxk = mink + unit
        pid = os.fork()
        if pid > 0:
            pids.append(pid)
        else:
            s = slice(mink, maxk)  # 子进程开始计算
            with open("%d" % os.getpid(), "w") as f:
                f.write(str(s))
            sys.exit(0)  # 子进程结束
    sums = []
    for pid in pids:
        os.waitpid(pid, 0)  # 等待子进程结束
        with open("%d" % pid, "r") as f:
            sums.append(float(f.read()))
        os.remove("%d" % pid)  # 删除通信的文件
    return math.sqrt(sum(sums) * 8)


print pi(10000000)

输出

3.14159262176

管道pipe

管道是Unix进程间通信最常用的方法之一,它通过在父子进程之间开通读写通道来进行双工交流。我们通过os.read()和os.write()来对文件描述符进行读写操作,使用os.close()关闭描述符。

640?wx_fmt=png

上图为单进程的管道

640?wx_fmt=png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python多进程通信可以使用以下几种方式: 1. 队列(Queue):可以通过队列实现多进程的数据传递。多个进程可以通过向队列中放入数据或从队列中取出数据来进行通信。Python中提供了`multiprocessing.Queue`类来实现进程通信。 ```python from multiprocessing import Process, Queue def worker(q): data = q.get() # 处理数据 if __name__ == '__main__': q = Queue() p = Process(target=worker, args=(q,)) p.start() q.put(data) # 向队列中放入数据 p.join() ``` 2. 管道(Pipe):管道是一种双向通信机制,可以在两个进程之传递数据。Python中的`multiprocessing.Pipe`类可以用于创建管道。 ```python from multiprocessing import Process, Pipe def worker(conn): data = conn.recv() # 处理数据 conn.send(result) # 向管道发送数据 if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=worker, args=(child_conn,)) p.start() parent_conn.send(data) # 向管道发送数据 result = parent_conn.recv() # 从管道接收数据 p.join() ``` 3. 共享内存(Shared Memory):多个进程可以通过共享内存来实现数据共享。Python中的`multiprocessing.Value`和`multiprocessing.Array`类可以用于创建共享内存。 ```python from multiprocessing import Process, Value, Array def worker(val, arr): val.value = 1 arr[0] = 2 if __name__ == '__main__': val = Value('i',0) # 创建共享变量 arr = Array('i', [0, 0, 0]) # 创建共享数组 p = Process(target=worker, args=(val, arr)) p.start() p.join() print(val.value) # 输出共享变量的值 print(arr[:]) # 输出共享数组的值 ``` 以上是Python多进程通信的几种常用方式,根据具体需求选择合适的方式进行进程数据传递。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值