gpt4 book ai didi

python - 异步处理高速公路订阅中的消息

转载 作者:行者123 更新时间:2023-12-02 18:39:34 26 4
gpt4 key购买 nike

我在docker容器中运行了一个python“Device”。它连接到Crossbar路由器,在订阅的 channel 上接收高速公路/ WAMP事件消息。

发布特定事件后,我的设备正在调用一种方法,该方法将在几秒钟内完成。
现在,我希望它在方法仍在运行时跳过或处理收到的同一事件的任何消息。我试图通过使用Twisted的@inlinecallback装饰器并在设备上设置“self.busy”标志来实现此目的。

但是它不是立即返回带有延迟的,而是表现得像普通的阻止方法一样,以便传入的消息被依次处理。

这是我的代码:

from autobahn.twisted.wamp import ApplicationSession
from twisted.internet.defer import inlineCallbacks

class Pixel(ApplicationSession):

@inlineCallbacks
def onJoin(self, details):
yield self.subscribe(self.handler_no_access, 'com.event.no_access')

@inlineCallbacks
def handler_no_access(self, direction):
entries = len(self.handlers['no_access'][direction])

if entries == 0:
self.handlers['no_access'][direction].append(direction)
result = yield self._handler_no_access()
return result

else:
yield print('handler_no_access: entries not 0: ', self.handlers['no_access'])

@inlineCallbacks
def _handler_no_access(self):
for direction in self.handlers['no_access']:

for message in self.handlers['no_access'][direction]:
yield self._timed_switch(self.direction_leds[direction], 'red', 0.2, 5)
self.handlers['no_access'][direction] = []

顺便说一句,我已经用self.handler字典来破解了。

编辑

阻止方法是:
yield self._timed_switch(self.direction_leds[direction], 'red', 0.2, 5)

它在RaspberryPi的GPIO上控制Neopixel,使其闪烁1s。对该方法的任何进一步调用
def handler_no_access(self, direction)

_timed_switch尚未完成时,将被跳过,因此它们不会堆叠。

解决方案
@inlineCallbacks
def handler_no_access(self, direction):
direction = str(direction)

if self.busy[direction] is False:

self.busy[direction] = True

# non-blocking now
yield deferToThread(self._handler_no_access, direction)

else:
yield print('handler_no_access: direction {} busy '.format(direction))

def _handler_no_access(self, direction):

# this takes 1s to execute
self._timed_switch(self.direction_leds[direction], 'red', 0.2, 5)

self.busy[direction] = False

最佳答案

inlineCallbacks不会将阻塞代码变成非阻塞代码。它只是使用Deferreds的替代API。递延只是管理回调的一种方法。

您需要重写您的阻止代码,以便以其他某种方式进行非阻止。您实际上并没有说过代码的哪一部分被阻塞,也没有说什么阻塞了,因此很难建议您如何执行此操作。使阻塞代码变为非阻塞的唯一两​​个通用工具是线程和进程。因此,您可以在单独的线程或进程中运行该函数。该功能可能会也可能不会在这样的执行上下文中起作用(再次,无法确切知道其功能是无法知道的)。

关于python - 异步处理高速公路订阅中的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46795248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com