美文网首页Flask
python多进程间通信与接口间调用

python多进程间通信与接口间调用

作者: Zeno00 | 来源:发表于2017-07-16 11:32 被阅读564次

最近在写一个小机器人的小项目,将比较耗时且繁琐的任务交由机器人处理,解放出人力资源。
机器人功能已完成。但是使用由主系统推送信息,到机器人执行完成,再返回主系统结果,这样的单进程模式,显然不合理,于是想到了利用python的多进程模式。

flow.png

多进程

多进程使用python内置的multiprocessing模块,它提供了一个Process类来代表一个进程对象。创建子进程时,只需要传入一个执行函数和函数的参数,用start()方法启动。主程序和子程序的数据通信呢?也很简单,在主进程中使用put()方法将数据传给子进程,在子进程中用get()接收数据即可。

from multiprocessing import Process,Queue
...
#创建并启动子进程
q = Queue()
#主进程写入数据
q.put(data)
p = Process(target=sub_proc, args=('这是子进程', q))
p.start()
...
#子进程内接收数据
a=q.get()
...

接口调用

接口开发使用了flask-restful,编写了两个接口:RobotNext,分别注册到/v1/subprocess/v1/nextRobot用于接收主程序消息,Next用来返回机器人执行结果。
完整代码如下:
1.multiprocess.py

# coding:utf-8
# Created by Allen Zhang
# Date: 2017/7/15
import json
from multiprocessing import Process,Queue
import os
from time import sleep
from flask_restful import Api,Resource
from flask import Flask, request
import requests


app = Flask(__name__)
api = Api(app)

#模拟比较耗时的机器人程序,作为子进程,由主进程调用
def sub_proc(name,q):
    print('运行子进程:%s (%s)'%(name,os.getpid()))
    a=q.get()
    print(a)
    sleep(4)
    print('子进程结束')

#子进程中的结果,返回给主程序
@app.route('/',methods=['POST'])
def next_step():
    print('调用下一个接口next')
    head = {"Content-Type":"application/json"}

    url ='http://127.0.0.1:8090/v1/next'
    data = json.dumps({'hi':'This is post from another api'})
    resp = requests.post(url,data=data,headers=head)
    print(resp.text)

#定义子进程并启动
def run_sub_process(data):
    q = Queue()
    q.put(data)
    p = Process(target=sub_proc, args=('这是子进程', q))
    print('子进程启动,,,')
    # 启动子进程
    p.start()
    next_step()

#机器人接口,接收主系统推送的信息,信息无误会立即启动机器人,并即时返回消息给主系统
class Robot(Resource):
    def post(self):
        data = request.get_data().decode()
        if data:
            run_sub_process(data)
            return 'Run sub process and ok'
        else:
            return 'Falied'


api.add_resource(Robot,'/v1/subprocess')


if __name__ == '__main__':
    app.run(debug=True,port=8080)

2.接收接口,在子进程中调用: simple.py

# coding:utf-8
# Created by Allen Zhang
# Date: 2017/7/15


from flask_restful import Api, Resource
from flask import Flask, request, jsonify

app = Flask(__name__)
api = Api(app)


class Next(Resource):
    def post(self):
        data = request.get_data()
        # print(data)
        print('调用接收服务成功:接收内容是:%s' % data.decode())
        return jsonify({'msg': 'Success'})


api.add_resource(Next, '/v1/next')

if __name__ == '__main__':
    app.run(debug=True, port=8090)

测试

同时运行 multiprocess.py和simple.py 。
在终端使用curl调用/v1/subprocess 接口,检查调用情况,会发现子程序调用成功,并成功返回结果。

curl -d {'wer':'ds'} http://127.0.0.1:8080/v1/subprocess

运行结果

result.png

参考
廖雪峰的官网-多进程
使用flask-restful创建接口

相关文章

  • python多进程间通信与接口间调用

    最近在写一个小机器人的小项目,将比较耗时且繁琐的任务交由机器人处理,解放出人力资源。机器人功能已完成。但是使用由主...

  • iOS进程间通信

    线程间通信 :通过performSelector系列的方法 可以实现 各种线程间的通信(通信 :调用与传参)进程间...

  • 【python】进程间通信:Queue的详细用法

    关于python 进程间通信 Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。 进程间通...

  • linux进程间通信(1)

    一、进程通信概述 1、什么是进程间通信?什么是线程间通信? 进程间通信: 进程间通信就指的是用户空间中进程A与进程...

  • python 进程池异步调用与进程间通信

    1、类包含不能序列化的属性时,多进程异步执行失败 执行上述代码时,多进程无法执行,因为A中包含了无法序列化的poo...

  • 第二十三章 进程间通信介绍(一)

    本章目标: 进程同步与进程互斥 进程间通信目的 进程间通信发展 进程间通信分类 进程间共享信息的三种方式 IPC对...

  • Binder使用

    Binder 在安卓使用Binder实现进程间通信需要做哪些工作 如何模糊跨进程调用与进程内调用? 如何使用AID...

  • 进程间通信与线程间通信

    操作系统的主要任务是管理计算机的软件、硬件资源。现代操作系统的主要特点是多用户和多任务,也就是程序的并行执行,wi...

  • python进线程——多进程间的通信

    1. 进程间与线程间通信区别 (1)线程间通信的类与锁在进程间是不适用的,必须使用multiprocessing中...

  • 8.进程间通信与进程池

    进程间通信与进程池 进程间通信-Queue 通常利用multiprocessing模块的Queue实现多线程之间的...

网友评论

    本文标题:python多进程间通信与接口间调用

    本文链接:https://www.haomeiwen.com/subject/ukytkxtx.html