Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最佳实践;集中收集并执行”;用Python_Python_Python 3.x_Event Handling - Fatal编程技术网

最佳实践;集中收集并执行”;用Python

最佳实践;集中收集并执行”;用Python,python,python-3.x,event-handling,Python,Python 3.x,Event Handling,我只是资助自己实现一个基于计时器的版本“将事件列表作为一个组处理”,以确保资源的安全——再一次——我想知道是否有一个很好的通用pythonic方法 您可能知道这一点:您正在处理重复发生的事件,如鼠标移动、文件系统更改等,您必须对这些事件进行一些计算,作为对这些事件的反应,但如果您可以使用事件流中的一个小中断来处理这些事件,那将是非常棒的。可能是因为较旧的事件被较新的事件失效(处理最旧的事件就足够了),或者是因为事件可以以某种方式压缩在一起 例如:鼠标移动(仅绘制最新位置)、编辑器中的“自动保存”

我只是资助自己实现一个基于计时器的版本“将事件列表作为一个组处理”,以确保资源的安全——再一次——我想知道是否有一个很好的通用pythonic方法

您可能知道这一点:您正在处理重复发生的事件,如鼠标移动、文件系统更改等,您必须对这些事件进行一些计算,作为对这些事件的反应,但如果您可以使用事件流中的一个小中断来处理这些事件,那将是非常棒的。可能是因为较旧的事件被较新的事件失效(处理最旧的事件就足够了),或者是因为事件可以以某种方式压缩在一起

例如:鼠标移动(仅绘制最新位置)、编辑器中的“自动保存”或文件系统上的自动同步,或者(在我的示例中)监视文件系统更改并重新编译某些内容

通常我会查看如何使用
计时器
,并思考如何避免额外的线程,并为一个在我看来非常简单的问题提出一些半成品但复杂的解决方案。
出现了很多问题:

  • 如何避免并发处理(例如,如果我使用
    threading.Timer
    并启动线程执行工作)
  • 如何确保要处理的事件有时间限制(如果连续不断地传入事件而不中断)
  • 如果可能,如何避免线程
  • 如何避免创建过于复杂的框架
  • (随便你说)
我想要的是这样的东西:

timer = SomeContinuousTimer()
new_events = []
while True:
   event = wait_for(inotify_adapter.event_gen(), timer.timeout())
   if event == timer.TIMEOUT:
       my_handler_func(new_events)
   else:
       new_events.append(event)
       timer.restart(1500)
bunch_handler = BunchHandler()
new_events = []

def read_events():
    for event in inotify_adapter.event_gen():
        new_events.append(event)

while True:
    # will run `read_events` asynchronously until 1.5sec have passed since the
    # last event
    bunch_handler.read(read_fn=read_events, bunch_wait=1500)

    handle_events(new_events)
但是
wait\u for
必须像
select
那样工作,为此我需要文件描述符,而上面的代码已经比我实际期望的要多了一点

我真的很高兴得到的是这样使用:

timer = SomeContinuousTimer()
new_events = []
while True:
   event = wait_for(inotify_adapter.event_gen(), timer.timeout())
   if event == timer.TIMEOUT:
       my_handler_func(new_events)
   else:
       new_events.append(event)
       timer.restart(1500)
bunch_handler = BunchHandler()
new_events = []

def read_events():
    for event in inotify_adapter.event_gen():
        new_events.append(event)

while True:
    # will run `read_events` asynchronously until 1.5sec have passed since the
    # last event
    bunch_handler.read(read_fn=read_events, bunch_wait=1500)

    handle_events(new_events)

这是我应该使用
async
/
wait
的典型场景吗?如果
async
不是选项,是否有框架?是否有一个异步框架用于此特定场景?

这不太好,但它实现了我想要的,并且可能作为一个示例,显示了我所说的:)

这种方法有一些缺点: *您需要使用
async
*事件收集器将在
max\u wait
秒后返回,无论是否已看到任何事件(因此,如果未发生任何事件,它将充当超时) *每次都会创建一个新的计时器,而不是重置计时器