Python电路fram中的延迟/暂停+恢复事件(处理)

2024-05-13 22:41:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的项目中,我使用Worker来进行一些与事件相关的文件处理,并避免阻止其他事件的处理。 我需要的是能够在Worker完成时将事件(需要文件处理)置于备用状态(不需要其他组件进一步处理),然后继续处理序列。在

我不能在Worker完成时发出新事件,因为这可能会导致其他组件多次重新处理“相同”事件。在

是否有任何方法可以延迟(即暂停和恢复)事件传播以完成我需要的任务?有没有更好的方法来解决我的用例?在

附加说明:我无法避免阻塞行为,因为我需要使用一些外部(阻塞)库调用。在

编辑: 源代码示例:

from time import sleep
from circuits import Component, Debugger, handler, Event, Worker, task


class my_event(Event):
    pass


def heavy_task():
    print "heavy task"
    sleep(3)


class NextHandler(Component):
    @handler("my_event", priority=10)
    def my_event(self, event):
        print "Handler 2"


class Handler(Component):
    _worker = Worker()

    @handler("my_event", priority=20)
    def my_event(self, event):
        self.fire(task(heavy_task), self._worker)
        print "Handler 1"
        # how do I delay "event" until "heavy_task" is completed?


class App(Component):
    h1 = Handler()
    h2 = NextHandler()

    def started(self, component):
        print "Running"
        self.fire(my_event())


if __name__ == '__main__':
    (App() + Debugger()).run()

在本例中,我希望延迟“Handler”事件,以便“NextHandler”在“heavy\u task”完成工作之前不会接收它。在


Tags: 文件selfeventtaskmydef事件class
1条回答
网友
1楼 · 发布于 2024-05-13 22:41:35

根据您更新的问题和编辑;以下是您“等待”事件完成的方式:

示例:

from time import sleep
from circuits import Component, Debugger, handler, Event, Worker, task


class my_event(Event):
    pass


def heavy_task():
    print "heavy task"
    sleep(3)


class NextHandler(Component):
    @handler("my_event", priority=10)
    def my_event(self, event):
        print "Handler 2"


class Handler(Component):
    _worker = Worker(process=True)

    @handler("my_event", priority=20)
    def my_event(self, event):
        # Fire and Wait for: task()
        # This happens asynchornously under the covers
        # but gives you a synchronous API. Effectively
        # turning my_event into a coroutine.
        yield self.call(task(heavy_task), self._worker)

        # This will only print after task() is complete.
        print "Handler 1"


class App(Component):
    h1 = Handler()
    h2 = NextHandler()

    def started(self, component):
        print "Running"
        self.fire(my_event())


if __name__ == '__main__':
    (App() + Debugger()).run()

输出:

^{pr2}$

请参阅上面的评论。在

相关问题 更多 >