python - 线程中的回调函数(PySNMP)阻止其他线程启动
问题描述
我在主线程中尝试了这个示例PySNMP Trap Receiver,一切正常,但是当我以多线程作为第一个线程启动它时,我无法启动其他线程。
- 如果我发送一个陷阱,所有其他线程都会成功启动,没有陷阱除了陷阱接收器之外什么都没有。
- 我试过
loop.call_soon_threadsafe
了,没有帮助
def _callback_func(self, snmpEngine, stateReference, contextEngineId, contextName,
varBinds, cbCtx):
execContext = snmpEngine.observer.getExecutionContext(
'rfc3412.receiveMessage:request')
source = (execContext['transportAddress'][0]) # source
trap_oid = varBinds[1][1]
value = varBinds[2][1]
trap=[]
trap.append(source)
trap.append(trap_oid)
trap.append(value)
self.q.put(trap)
self.logger.warning(f"[SNMPTRAP] Received trap:{source}, {trap_oid}, {value}")
def _receiver(self):
try:
# Register SNMP Application at the SNMP engine
ntfrcv.NotificationReceiver(self.snmpEngine, self._callback_func)
self.loop.run_forever()
except Exception as e:
self.logger.exception(str(e))
def _configure(self):
return self
def start(self):
self.worker = Thread(target=self._receiver)
self._configure()
try:
self.logger.info("Starting thread 'trap receiver'...")
self.worker.start()
if self.worker.is_alive():
self.logger.info("Thread 'trap_receiver' started")
while True:
data = self.q.get()
self.logger.debug(f"Returned trap {data}")
return data
else:
self.logger.error("Couldn't start thread 'trap receiver'")
except Exception as e:
self.logger.error(f"An exception occured while starting thread 'trap receiver' {str(e)}")
解决方案
推荐阅读
- sql - 对行求和以产生表中的列
- php - 从 .json URL 优化 file_get_contents() 脚本
- javascript - 为什么我的代码没有打印最终结果?它应该在按钮下方打印,但没有打印任何内容
- java - 如何使用独立的 Jetty 服务器配置 Resteasy?
- google-cloud-platform - Google PubSub 排序密钥问题,未启用消息排序
- python - PySpark:如何使用多列中的值来执行某种聚合?
- flutter - 当用户(从后台)返回应用程序时,如何刷新页面?
- python - 具有多个 gunicorn 工作者的 Flask-SQLAlchemy 导致读取不一致
- node.js - 如何修复 npm ERR!同行部门失踪
- mysql - Laravel Query 根据 2 个依赖列获取行