我已经安装了大约40个代理运行一些模拟。但我遇到了一些线程错误。错误如下所示。
2019-08-06 10:56:24,120 (socialagent-3.0 16231)错误:线程中的异常-31: 2019-08-06 10:56:24 (socialagent-3.0 16231)错误:回溯(最近一次调用):2019-08-06 10:56:24 135 (socialagent-3.0 16231)错误:文件“/usr/lib/python2.7/线程.”,第801行,在__bootstrap_inner中 2019-08-06 10:56:24 162(社交代理-3.0 16231)错误: self.run() 2019-08-06 10:56:24,177 (socialagent-3.0 16231)错误:文件“/usr/lib/python2.7/tening.py”,第1073行,在运行中 2019-08-06 10:56:24,198 (社交代理-3.0 16231)错误: self.function(*self.args,**self.kwargs) 2019年-08-06 10:56:24,201 (socialagent-3.0 16231)错误:文件"/home/jenny/.volttron/agents/50b42ee5-b6af-4a25-aa89-97e2b1a823e1/socialagent-3.0/social/agent.py",第145行,在enter_phase3中 2019-08-06 10:56:24 240(社交代理-3.0 16231)错误: self.vip.pubsub.publish('pubsub',ids_topic,message=message) 2019年-08-06 10:56:24 265 (socialagent-3.0 16231)错误:文件"/home/jenny/workspace/volttron/volttron/platform/vip/agent/subsystems/pubsub.py",行607,已发布 2019-08-06 10:56:24 267(社交代理-3.0 16231)错误: self.vip_socket.send_vip(b'','pubsub',帧,result.ident,copy=False) 2019年-08-06 10:56:24,279 (socialagent-3.0 16231)错误:文件"/home/jenny/workspace/volttron/volttron/platform/vip/socket.py",行404,在send_vip中 2019-08-06 10:56:24 326(社交代理-3.0 16231)错误: 以self._sending(标志)作为标志: 2019-08-06 10:56:24 327 (socialagent-3.0 16231)错误:文件"/usr/lib/python2.7/contextlib.py",第17行,__enter__ 2019-08-06 10:56:24 377(社交代理-3.0 16231)错误: 返回self.gen.next() 2019年-08-06 10:56:24,402 (socialagent-3.0 16231)错误:文件"/home/jenny/workspace/volttron/volttron/platform/vip/green.py",第78行,在_sending中 2019-08-06 10:56:24 413(社交代理-3.0 16231)错误: 而不是lock.acquire(非标志和NOBLOCK): 2019年-08-06 10:56:24 422 (socialagent-3.0 16231)错误:文件"/home/jenny/workspace/volttron/env/local/lib/python2.7/site-packages/gevent/lock.py",行210,在获取 2019-08-06 10:56:24,427 (社交代理-3.0 16231)错误: rc =self._block.acquire(阻塞) 2019年-08-06 10:56:24,442 (socialagent-3.0 16231)错误:文件"gevent/_semaphore.py",第198行,在gevent._semaphore.Semaphore.acquire (gevent/gevent._semaphore.c:4117) 2019-08-06 10:56:24 451(社交代理-3.0 16231)错误: def获得(self,blocking=True,timeout=None): 2019-08-06 10:56:24,485 (socialagent-3.0 16231)错误:文件"gevent/_semaphore.py",第226行,在gevent._semaphore.Semaphore.acquire中(gevent/gEv.gEv.3.944) 2019-08-06 10:56:24,493 (社交代理-3.0 16231)错误: 超时值=self._do_wait(超时) 2019年-08-06 10:56:24,503 (socialagent-3.0 16231)错误: gevent._semaphore.Semaphore._do_wait中的"gevent/_semaphore.py“文件,第166行(gevent/gEv.3178) 2019-08-06 10:56:24,546 (社交代理人-3.0 16231)错误: 结果= get_hub().switch() 2019年-08-06 10:56:24,552 (社交代理-3.0 16231)错误:文件"/home/jenny/workspace/volttron/env/local/lib/python2.7/site-packages/gevent/hub.py",行609,在开关中 2019-08-06 10:56:24,574 (社交代理-3.0 16231)错误: 返回greenlet.switch(自) 2019年-08-06 10:56:24,589 (社交代理-3.0 16231)错误: LoopExit:(“此操作将永远阻塞”,) 2019-08-06 10:56:24,640 (社交代理人-3.0 16231)错误:
这正是我在agent.py文件中的第145行的内容:self.vip.pubsub.publish('pubsub', ds_topic, message=message),我已经将消息定义为message =“This”
当我安装更少的代理时,我根本不会遇到这个问题。我正在运行一台1.9GHz英特尔核心i3机器,这可能是相关的吗?为了提供有助于诊断问题的尽可能多的信息,我在这里展示了我的代理人的一些片段:
from threading import Timer
@Core.receiver("onstart")
def starting(self, sender, **kwargs):
_log.debug('Subscribing to all relevant topics')
self.vip.pubsub.subscribe('pubsub', pred_topic, callback=self.from_pred)
def from_pred(self, peer, sender, bus, topic, headers, message):
message_dict = message_parser.mess_conv(message)
message = "{}: {}".format(statID, message_dict['feat_pro'])
# Publish to all neighbour topics and to our own topic
for k in neighbours:
self.vip.pubsub.publish('pubsub', k, message=message)
self.vip.pubsub.publish('pubsub', social_topic, message=message)
# ...and start timer to allow communication for 8s
timer = Timer(8, self.enter_phase)
timer.start()
def enter_phase(self):
# Send a message to IDS to begin phase
_log.debug("In agent {}. We have {}".format(stationID, sent_prob))
if stationID in sent_prob.keys():
message = "phase3: 1"
else:
message = "phase3: 0"
self.vip.pubsub.publish('pubsub', ds_topic, message=message)另外,timer = Timer(8, self.enter_phase)是否是问题的一部分?我不是这样的开发专家,我会感激任何帮助(用简单的语言:)。
发布于 2019-08-12 19:00:43
这可能是由于猴子补丁问题造成的。VOLTTRON平台代码使用gevent修补套接字和未修补的线程。
您的代理是执行monkey.patchall()还是导入执行gevent monkey.patchall()的模块?您的代理是否依赖预期未修补的套接字的包/其他库?如果代理需要未修补的套接字模块,则可以在代码中导入套接字语句之后重新加载(套接字)。VOLTTRON为mongo史学家这样做(请参阅volttron/platform/dbutils/mongoutils.py),因为pymongo库需要解补丁套接字和线程模块。
https://stackoverflow.com/questions/57381055
复制相似问题