Python多进程协作模拟实现流程

 更新时间:2023年01月17日 10:15:46   作者:永远的麦田  
当多个进程使用同一份数据资源的时候,因为进程的运行没有顺序,运行起来也无法控制,如果不加以干预,往往会引发数据安全或顺序混乱的问题,所以要在多个进程读写共享数据资源的时候加以适当的策略,来保证数据的一致性问题

由于python多线程无法发挥多核的作用,因此当计算量很大的时候就需要考虑多进程。

只不过多进程比较麻烦一些,进程中通信向来是一件麻烦事。

python提供了multiprocessing 模块,应该会提供不少便利

假设我们做量化交易需要运行一个算法,针对一只票每运行一次需要30秒,运行完成将结果作为一个因子交给另一个计算模块运行,最后将计算结果统计出来。如果只运行一只票问题不大,大不了等一下就好,同时运行10票的话就很有必然考虑多进程以加快速度。

pro_queue为生产进程的数据队列,生产进程完成生产后将自己相关数据装产pro_queue中

calc_queue为计算进程的数据队列,计算进程先将生产进程的数据通过参数传递的方式获取到,然后进行计算,并将计算结果存入calc_queue中

主进程在最后不断获取计算进程的计算结果,并将其累加,最终获取到一个总的计算结果

生产进程:

def func_a(i, p: queues):
    print(F"第{i}个生产进程: 进程号:{os.getpid()},开始...")
    time.sleep(random.randint(1, 5))
    result = random.randint(50, 100)
    print(F"第{i}个生产进程: 完成。生产结果[{result}]。")
    p.put((i, os.getpid(), result))

计算进程:

def func_b(i, data, q: queues):
    print(F"第{i}个计算进程: 进程号:{os.getpid()}, 数据源{data[0]}:{data[1]}:{data[2]},开始...")
    time.sleep(random.randint(1, 3))
    result = data[2] * 100
    print(F"第{i}个计算进程: 完成。计算结果【{result}】")
    q.put(result)

程序一开始先将生产进程启动起来:其中process_num表示同时启动多少个生产进程

    for i in range(process_num):
        p = Process(target=func_a, args=(i, pro_queue,))
        p.start()

然后不停等待生产进程的结果,每等到一个结果就启动一个计算进程

    for i in range(process_num):
        data = pro_queue.get()
        p = Process(target=func_b, args=(i, data, calc_queue))
        p.start()

最后就是等待计算进程的计算结果

    s = 0
    for i in range(process_num):
        s += calc_queue.get()
    print(F"所有计算完成,总结果:{s}")

补上程序一开始的两个队列的申明:

import multiprocessing
import time
from multiprocessing import Process
from multiprocessing import queues
import random
import os
    pro_queue = queues.Queue(ctx=multiprocessing)
    calc_queue = queues.Queue(ctx=multiprocessing)
    process_num = 5

到此这篇关于Python多进程协作模拟实现流程的文章就介绍到这了,更多相关Python多进程协作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 复习Python中的字符串知识点

    复习Python中的字符串知识点

    这篇文章主要介绍了Python中字符串的一些知识点,来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • python实现AES加密与解密

    python实现AES加密与解密

    这篇文章主要为大家详细介绍了python实现AES加密与解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 在Python中使用MySQL--PyMySQL的基本使用方法

    在Python中使用MySQL--PyMySQL的基本使用方法

    PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。这篇文章主要介绍了在Python中使用MySQL--PyMySQL的基本使用,需要的朋友可以参考下
    2019-11-11
  • python数据分析基础之pandas中loc()与iloc()的介绍与区别介绍

    python数据分析基础之pandas中loc()与iloc()的介绍与区别介绍

    我们经常在寻找数据的某行或者某列的时常用到Pandas中的两种方法iloc和loc,两种方法都接收两个参数,第一个参数是行的范围,第二个参数是列的范围,这篇文章主要介绍了python数据分析基础之pandas中loc()与iloc()的介绍与区别,需要的朋友可以参考下
    2024-07-07
  • Pytorch之contiguous的用法

    Pytorch之contiguous的用法

    今天小编就为大家分享一篇Pytorch之contiguous的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 在Python中获取操作系统的进程信息

    在Python中获取操作系统的进程信息

    今天小编就为大家分享一篇在Python中获取操作系统的进程信息,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python3实现zabbix告警推送钉钉的示例

    python3实现zabbix告警推送钉钉的示例

    今天小编就为大家分享一篇python3实现zabbix告警推送钉钉的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python Joblib库使用方法案例总结

    Python Joblib库使用方法案例总结

    Python Joblib库是一个用于并行计算和数据预处理的工具库。它可以帮助用户快速处理大量数据,提高计算效率。其中,最常用的功能是并行计算,可以使用多个CPU核心同时处理任务,大大缩短计算时间。此外,Joblib还提供了一些数据预处理的功能,可以帮助用户更好地处理数据
    2023-06-06
  • Python Dataframe 指定多列去重、求差集的方法

    Python Dataframe 指定多列去重、求差集的方法

    今天小编就为大家分享一篇Python Dataframe 指定多列去重、求差集的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 解决PyTorch与CUDA版本不匹配的问题

    解决PyTorch与CUDA版本不匹配的问题

    这篇文章主要介绍了解决PyTorch与CUDA版本不匹配的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论