0

我正在尝试对 Volttron 中的远程代理进行并发 JSONRPC 调用。我正在使用 Volttron 5.1.0(带有 gevent 1.1.2 和 requests 2.11.1)。

该代码按预期工作。但是,从日志文件中,我注意到请求不是同时运行的。我不确定我错过了什么。

我尝试了如何启用请求异步模式中提到的建议?(即,处理请求中的异步部分、猴子补丁等)。但是没有解决办法,要么解决方案过时,要么所需的模块在 volttron env 中不可用(我有点担心版本要求)。

任何建议或意见都会有很大帮助。

代理代码相关部分如下:

代理代码

import gevent
import requests

url_roots = ['http://192.168.1.51:8080/', 'http://192.168.1.52:8080/']
jobs = [gevent.spawn(do_rpc, self._agent_id, url_root, 'pricepoint'
                                , get_json_params()
                                ) for url_root in url_roots
                                ]
gevent.joinall(jobs, timeout=11)


def do_rpc(id, url_root, method, params=None):
    result = False
    json_package = {
        'jsonrpc': '2.0',
        'id': id,
        'method':method,
    }
    json_package['params'] = params
    response = requests.post(url_root, data=json.dumps(json_package), timeout=10)
    if response.ok:
        if 'result' in response.json().keys():
            success = response.json()['result']
            if success:
                result = True
    return result

日志

2020-02-19 21:12:15,913 (xyzagent-0.4 28079) xyz.ispace_msg_utils 调试:validate_bustopic_msg()
2020-02-19 21:12:15,918 (xyzagent-0.4 28079) xyz.agent 调试:新价格点 (pp ) 本地总线上的消息,主题:建筑/价格点 ...
2020-02-19 21:12:15,919 (xyzagent-0.4 28079) xyz.agent 调试:***** 来自本地的新投标价格点:0.20 price_id: 2218566
2020-02-19 21:12:15,931 (xyzagent-0.4 28079) xyz.agent 调试: post_ds_new_pp()...
2020-02-19 21:12:15,932 (xyzagent-0.4 28079) xyz.agent 调试:美国 pp 消息数:1...
2020-02-19 21:12:15,933 (xyzagent-0.4 28079) xyz.agent 调试:处理 pp msg 1/1,价格 ID:2218566
2020-02-19 21:12 :15,938(xyzagent-0.4 28079)xyz.agent 调试:新 ttl:28。
2020-02-19 21:12:15,942 (xyzagent-0.4 28079) xyz.agent 调试:_ds_rpc_1_to_m()...
2020-02-19 21:12:15,953 (xyzagent-0.4 28079) requests.packages.urllib3.connectionpool信息:开始新的 HTTP 连接 (1): 192.168.1.51
2020-02-19 21:12:16,079 () volttron.platform.web DEBUG: {'jsonrpc': '2.0', 'id': '2503402', '结果':True}
2020-02-19 21:12:16,080 () volttron.platform.web DEBUG: res 是一个字典。
2020-02-19 21:12:16,238 (xyzagent-0.4 28079) requests.packages.urllib3.connectionpool 调试:“POST /bridge HTTP/1.1”200 53
2020-02-19 21:12:16,245 (xyzagent-0.4 28079 ) requests.packages.urllib3.connectionpool INFO: 开始新的 HTTP 连接 (1): 192.168.1.52
2020-02-19 21:12:16,526 (xyzagent-0.4 28079) requests.packages.urllib3.connectionpool 调试:“POST /bridge HTTP/1.1”200 53
2020-02-19 21:12:16,529 (xyzagent-0.4 28079 ) xyz.agent DEBUG: post pp to ds (ZoneController-51), result: 成功!!!
2020-02-19 21:12:16,529 (xyzagent-0.4 28079) xyz.agent 调试:将 pp 发布到 ds (ZoneController-52),结果:成功!!!
2020-02-19 21:12:16,530 (xyzagent-0.4 28079) xyz.agent 调试:_ds_rpc_1_to_m()...完成
2020-02-19 21:12:16,530 (xyzagent-0.4 28079) xyz.agent 调试:味精成功发布到所有 ds,将其从队列中删除
2020-02-19 21:12:16,530 (xyzagent-0.4 28079) xyz.agent 调试:重置成功 ds msg 的重试计数器
2020-02-19 21:12:16,530 (xyzagent-0.4 28079) xyz.agent 调试:post_ds_new_pp()...完成

4

1 回答 1

1

以下更改起到了作用。请注意,这只是monkey.patch_all()破坏 volttron。需要设置标志thread=False

代理代码

import gevent
from gevent import monkey
monkey.patch_all(thread=False, select=False)
import requests

日志

2020-02-20 14:36:29,981 (xyzagent-0.4 8657) xyz.agent 调试:_ds_rpc_1_to_m()...
2020-02-20 14:36:29,987 (xyzagent-0.4 8657) requests.packages.urllib3.connectionpool信息:开始新的 HTTP 连接 (1):192.168.1.51
2020-02-20 14:36:29,992 (xyzagent-0.4 8657) requests.packages.urllib3.connectionpool 信息:开始新的 HTTP 连接 (1):192.168.1.52

2020 -02-20 14:36:30,260 (xyzagent-0.4 8657) requests.packages.urllib3.connectionpool 调试:“POST /bridge HTTP/1.1”200 53
2020-02-20 14:36:30,333 (xyzagent-0.4 8657) requests.packages.urllib3.connectionpool 调试:“POST /bridge HTTP/1.1”200 53
2020-02-20 14:36:30,341 (xyzagent-0.4 8657) xyz.agent 调试:将 pp 发布到 ds (ZoneController-51),结果:成功!!!
2020-02-20 14:36:30,342 (xyzagent-0.4 8657) xyz.agent 调试:将 pp 发布到 ds (ZoneController-52),结果:成功!!!
2020-02-20 14:36:30,344 (xyzagent-0.4 8657) xyz.agent 调试:_ds_rpc_1_to_m()...完成

于 2020-02-20T09:26:51.740 回答