python中进程间通信及设置状态量控制另一个进程

目录
  • 一、python中进程间通信
  • 二、设置状态量控制另一个进程

一、python中进程间通信

业务场景:在当前遇到的业务场景中,我们需要启一个间隔任务,这个间隔任务跑一个算法,然后把算法的结果进行一些处理,并入库。任务目前间隔是一小时,算法运行时间要50多分钟,留给结果处理的时间并不多,所以有可能会出现超时。目前来说,优化方向在算法上会更为合理,因为结果处理本来就不用很多时间。但是在这个业务场景下,想要把结果处理的时间进行无限压缩,压缩到0,其实也是可以实现的,说是压缩为0,实际上就是在算法执行完成后,再启一个进程去处理,这样就不会由于需要进行数据处理而影响到算法的运行,将算法和结果处理分为两个独立的进程去处理。在最开始的程序中,是把算法运行和结果处理作为一个周期,而现在是把算法运行和结果处理分为两个周期去处理。

技术实现方案:

启动二个进程,其中一个运行算法,在算法运行结束后,发送一个状态值到另外一个进程,另外一个进程在收到状态量后启动数据处理即可。两个进程间互不影响即可。其实也相当于算法进程控制数据处理进程

测试场景构造代码:

from multiprocessing import Process,Pipe
import time
import sys
import os
def send_message(conn):
    for i in range(1000):
        print('send_message:%d'%i)
        print(os.getpid())
        conn.send(i)
        time.sleep(3)
def send_message1(conn):
    # for i in range(1000):
    print(conn.recv())
    while True:
        if conn.recv() % 5 == 0:
            print(' today is nice day')
        time.sleep(1)
if __name__ == '__main__':
        #创建一个进程通信管道
    left,right = Pipe()
    t1 = Process(target=send_message,args=(left,))
    t2 = Process(target=send_message1,args=(right,))
    t1.start()
    t2.start()

在这个案例场景下有一些需要注意的点:

  • 一、time.sleep()的问题,睡眠指定时间,总是会出错,具体的出错原因到现在也没有找到,这是原来出现的问题,在这里没有做长时间的测试,所以不一定会出现,但是还是要注意
  • 二、代码实现中与上述的描述差异有一些,如未启用调度任务,只是启了一个间隔运行的任务。
  • 三、数据处理进程一直处理空跑状态,会造成资源的浪费(更合理的应该是形成阻塞状态,但是对于阻塞状态的构造缺乏认知,所以先牺牲资源
  • 四、在上述描述的需求中,在算法运行及数据处理的上一节点还有一个调度任务在控制,这里未做出体现,其实应该把定时任务和数据处理作为两个周期独立出来才更符合上述描述中的需求。

二、设置状态量控制另一个进程

业务场景:在当前遇到的业务场景中,我们需要启一个间隔任务,这个间隔任务跑一个算法,然后把算法的结果进行一些处理,并入库。任务目前间隔是一小时,算法运行时间要50多分钟,留给结果处理的时间并不多,所以有可能会出现超时。目前来说,优化方向在算法上会更为合理,因为结果处理本来就不用很多时间。但是在这个业务场景下,想要把结果处理的时间进行无限压缩,压缩到0,其实也是可以实现的,说是压缩为0,实际上就是在算法执行完成后,再启一个进程去处理,这样就不会由于需要进行数据处理而影响到算法的运行,将算法和结果处理分为两个独立的进程去处理。在最开始的程序中,是把算法运行和结果处理作为一个周期,而现在是把算法运行和结果处理分为两个周期去处理。

上面的解决方案中只涉及到了启用两个进程去运行两个任务,并未涉及到启用定时任务框架,所以可能会显得和上述的业务场景不一致,所以在这里重新解决一下。上面也是没有问题的,只是把定时任务框架也作为一个任务去处理即可。然后在定时任务运行完程后,向另外一个进程传入一个参数,作为启动另一个进程的状态量即可。当然,在这里,两个进程还是完全占满的,即处理阻塞状态。对于资源的利用还是没有完全达到最好。后续再考虑使用进程池的方式,看是否可以让其中的一个进程运行完后直接释放资源。

技术解决方案如下:

from multiprocessing import Process,Pipe
import time
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.asyncio import AsyncIOScheduler
# schedule = BackgroundScheduler()
schedule = BlockingScheduler(timezone="Asia/Shanghai")
# schedule = AsyncIOScheduler(timezone="Asia/Shanghai")
def algorithm(conn):
    print('start_run')
    conn.send('please run')
    # time.sleep(5)
def worth_result(conn):
    while True:
        if conn.recv() == 'please run':
            print(conn.recv() + ' very nice!')
def time_job(conns):
    schedule.add_job(func=algorithm,trigger='interval',seconds=5,args=(conns,))
    schedule.start()
if __name__ == '__main__':
    left,right = Pipe()
    t1 = Process(target=time_job,args=(left,))
    t2 = Process(target=worth_result,args=(right,))
    t1.start()
    t2.start()

在这里还有一些点需要说明,定时任务选择那一种类型其实都没有关系,阻塞和非阻塞其实没有关系,因为我们在这里是直接启了两个进程,每个进程间是相互独立的,并非是在定时任务下启用的两个进程,所以不会影响的。

关于这个解决方案还有的问题:

  • 一、上述所说,两个进程是占满的,所以对于资源来说,两个进程的利用率一直很高
  • 二、扩展性不足,如果在这个程序中还有其他需要处理的过程,就需要再添加进程,或者把他添加到当前的进程之下,代码重构会比较麻烦一些
  • 三、整个任务的控制不足,需要加以完善。比如对于运行状态一些控制及查看,一般程序如果运行时间较长的话,我们应该添加这样的接口,否则启动后如果没有出结果,我们是不知道其运行状态,有一点被动
  • 四、关于三,使用logging库,应该是可以直接去输出其日志,但是日志库作为第三方库,相当于是对整个运行状态进行监控,会不会再占用一个进程,这个需要去测试
  • 五、完备性及容灾处理,如果程序由于资源等其他问题挂掉后,会有一些数据冗余下来,也就是一些算法未进行处理,这个时候需要考虑怎么样去补数据?原始文件如果没有保留下来呢?而且如果这些数据是极重要的数据该怎么处理?如果程序挂掉后,应该如何快速的去处理呢?直接重启吗?
  • 六、如果数据处理的进程所用的时间比算法还多,那该怎么办?目前的业务来看,是远低于的,但是如果是远高于呢?可否将处理工作进行分配,利用多台机器来处理,然后再把结果合并起来?

分布式处理的思想越来越浓。

到此这篇关于python中进程间通信及设置状态量控制另一个进程的文章就介绍到这了,更多相关python进程通信内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python的进程间通信详解

    目录 进程概述 队列简介 多进程队列的使用 使用队列在进程间通信 总结 进程概述 ​ 进程(Process)是计算机中已运行程序的实体.进程与程序不同,程序本身只是指令.数据及器组织形式的描述,进程才是程序(那些指令和数据)的真正运行实体.例如在没有打开QQ时,QQ只是程序.打开以后,操作系统为QQ开启一个进程.再打开一个QQ,则又开启一个进程. ​ 那么在多进程中,每个进程之间是什么关系呢?其实每个进程都有自己的地址空间.内存.数据栈以及其他记录其运行状态的辅助数据.下通过一个例子验证一下进程

  • Python语法学习之进程间的通信方式

    目录 什么是进程的通信 队列的创建 - multiprocessing 进程之间通信的方法 进程间的通信 - 队列演示案例 批量给 send 函数加入数据 小节 进程间通信的其他方式 - 补充 什么是进程的通信 这里举一个例子接介绍通信的机制:通信 一词大家并不陌生,比如一个人要给他的女友打电话.当建立了通话之后,在这个通话的过程中就是建立了一条隐形的 队列 (记住这个词).此时这个人就会通过对话的方式不停的将信息告诉女友,而这个人的女友也是在倾听着.(嗯…我个人觉得大部分情况下可能是反着来的)

  • Python进程间通信 multiProcessing Queue队列实现详解

    一.进程间通信 IPC(Inter-Process Communication) IPC机制:实现进程之间通讯 管道:pipe 基于共享的内存空间 队列:pipe+锁的概念--->queue 二.队列(Queue) 2.1 概念-----multiProcess.Queue 创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. Queue([maxsize])创建共享的进程队列. 参数 :maxsize是队列中允许的最大项数.如果省略此参数,则无大小限制

  • Python RabbitMQ实现简单的进程间通信示例

    RabbitMQ    消息队列 PY threading Queue 进程Queue 父进程与子进程,或同一父进程下的多个子进程进行交互 缺点:两个不同Python文件不能通过上面两个Queue进行交互 erlong 基于这个语言创建的一种中间商 win中需要先安装erlong才能使用 rabbitmq_server start 安装 Python module pip install pika or easy_install pika or 源码 rabbit      默认端口15672

  • Python进程间的通信一起来了解下

    目录 通信方式 Queue介绍: 生产者和消费者模型 为什么要使用生产者和消费者模式 什么是生产者消费者模式 实现方式一:Queue 实现方式二:利用JoinableQueue 总结 通信方式 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块主要通过队列方式 队列:队列类似于一条管道,元素先进先出 需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态 Queue介绍: 创建队列的类(底层就是以管道和锁定的方式实现): Que

  • python中进程间通信详细介绍

    目录 进程间通信(IPC) 管道通信(Pipe) 1.通信原理 2. 实现方法 共享内存 1.通信原理 2.实现方法 信号量(信号灯集) 1.通信原理 2. 实现方法 3.代码演示 进程间通信(IPC) 必要性 进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信 常用进程间通信方法 管道 消息队列 共享内存 型号 信号量 套接字 管道通信(Pipe) 1.通信原理 在内存中开辟管道空间,生成管道操作对象,多个进程使用同一个管道对象进行读写即可实现通信 代码演示(w

  • Python进程间通信方式

    目录 一.通信方式 二.Queue介绍 三.方法介绍 三.生产者和消费者模型 四.什么是生产者消费者模式 实现方式一:Queue 实现方式二:利用JoinableQueue 一.通信方式 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块主要通过队列方式 队列:队列类似于一条管道,元素先进先出 需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态 二.Queue介绍 创建队列的类(底层就是以管道和锁定的方式实现): Queue

  • Python进程的通信Queue、Pipe实例分析

    本文实例讲述了Python进程的通信Queue.Pipe.分享给大家供大家参考,具体如下: 内容相关: 概念:进程的通信 Queue:创建与使用 Pipe:创建与使用 进程通信的概念 进程的资源空间是相互独立的,一般而言是不能相互访问的.但很多情况下进程间需要互相通信,来完成系统的某项功能.进程通过与内核及其它进程之间的互相通信来协调它们的行为. 通信方法: 数据传输:一个进程将它的数据发送给另一个进程[如socket一般,把需要通信的数据传输给对方] 管道:使用一片独立的区域[不在双方的资源空

  • python中进程间通信及设置状态量控制另一个进程

    目录 一.python中进程间通信 二.设置状态量控制另一个进程 一.python中进程间通信 业务场景:在当前遇到的业务场景中,我们需要启一个间隔任务,这个间隔任务跑一个算法,然后把算法的结果进行一些处理,并入库.任务目前间隔是一小时,算法运行时间要50多分钟,留给结果处理的时间并不多,所以有可能会出现超时.目前来说,优化方向在算法上会更为合理,因为结果处理本来就不用很多时间.但是在这个业务场景下,想要把结果处理的时间进行无限压缩,压缩到0,其实也是可以实现的,说是压缩为0,实际上就是在算法执

  • Python中使用socks5设置全局代理的方法示例

    0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks 0x03 测试 正常请求,httperror无法获得 加入socks5代理后,可以获得当前程序的全局代理可以 正常访问 import socket import socks socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 10808)

  • python中各种路径设置的方法详解

    目录 python永久添加搜索路径_Python sys.path永久添加 临时性添加 import sys os查看当前路径 _file_ os.path.dirname(path) 附:python路径的查看与修改 总结 python永久添加搜索路径_Python sys.path永久添加 在用户目录下,找到隐藏文件.bashrc 文件 然后在末尾添加 export PYTHONPATH=$PYTHONPATH:/home/dev/custom_path 操作:vim .bashrc 添加

  • 学习python中matplotlib绘图设置坐标轴刻度、文本

    总结matplotlib绘图如何设置坐标轴刻度大小和刻度. 上代码: from pylab import * from matplotlib.ticker import MultipleLocator, FormatStrFormatter xmajorLocator = MultipleLocator(20) #将x主刻度标签设置为20的倍数 xmajorFormatter = FormatStrFormatter('%1.1f') #设置x轴标签文本的格式 xminorLocator = M

  • Python中函数参数设置及使用的学习笔记

    一.参数和共享引用: In [56]: def changer(a,b): ....: a=2 ....: b[0]='spam' ....: In [57]: X=1 In [59]: L=[1,2] In [60]: changer(X,L) In [61]: X,L Out[61]: (1, ['spam', 2]) 函数参数是赋值得来,在调用时通过变量实现共享对象,函数中对可变对象 参数的在远处修能够影响调用者. 避免可变参数修改: In [67]: X=1 In [68]: a=X I

  • Python中为feedparser设置超时时间避免堵塞

    python有一个用于解析feed的模块:feedparser,feedparser解析各种feed是非常方便的,唯一比较恼火的是遇到一些badurl,经常会导致堵塞,因此需要为feedparser设置一个超时时间. 可是feedparser并没有提供这个功能,只好采用其他方法了,具体办法请参看feedparser项目的issue221. 其实也很简单,按照上面文档的说明 developers have had the ability to set a global timeout for ov

  • python中subplot大小的设置步骤

    subplot函数介绍 matplotlib下, 一个 Figure 对象可以包含多个子图(Axes), 可以使用 subplot() 快速绘制, 其调用形式如下 : subplot(numRows, numCols, plotNum) 下面话不多说,来一起看看python中subplot大小的设置步骤 用plt.figure(figsize=(10, 10)) 附参考文章:matplotlib中使用subplots创建窗口如何设置尺寸大小 在matplotlib一般使用plt.figure来设

  • Python中常用操作字符串的函数与方法总结

    例如这样一个字符串 Python,它就是几个字符:P,y,t,h,o,n,排列起来.这种排列是非常严格的,不仅仅是字符本身,而且还有顺序,换言之,如果某个字符换了,就编程一个新字符串了:如果这些字符顺序发生变化了,也成为了一个新字符串. 在 Python 中,把像字符串这样的对象类型(后面还会冒出来类似的其它有这种特点的对象类型,比如列表),统称为序列.顾名思义,序列就是"有序排列". 比如水泊梁山的 108 个好汉(里面分明也有女的,难道女汉子是从这里来的吗?),就是一个"

  • 深入理解Python中各种方法的运作原理

    方法在Python中是如何工作的 方法就是一个函数,它作为一个类属性而存在,你可以用如下方式来声明.访问一个函数: >>> class Pizza(object): ... def __init__(self, size): ... self.size = size ... def get_size(self): ... return self.size ... >>> Pizza.get_size <unbound method Pizza.get_size&g

随机推荐