Python进程间通信什么场景应用,怎样实现
Admin 2022-08-24 群英技术资讯 852 次浏览
今天这篇我们来学习和了解“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()
在这个案例场景下有一些需要注意的点:
业务场景:在当前遇到的业务场景中,我们需要启一个间隔任务,这个间隔任务跑一个算法,然后把算法的结果进行一些处理,并入库。任务目前间隔是一小时,算法运行时间要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()
在这里还有一些点需要说明,定时任务选择那一种类型其实都没有关系,阻塞和非阻塞其实没有关系,因为我们在这里是直接启了两个进程,每个进程间是相互独立的,并非是在定时任务下启用的两个进程,所以不会影响的。
关于这个解决方案还有的问题:
分布式处理的思想越来越浓。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python多线程编程之threading模块详解,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值。
这篇文章主要介绍了python可视化分析绘制带趋势线的散点图和边缘直方图,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
讲一下在Python中写好了一个脚本之后,怎么自动双击一个程序自动就跑起来。以及,怎么在Windows 10中设计定期定时触发并跑脚本,有需要的朋友可以参考下
本文主要介绍了Python实现消消乐小游戏,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008