【问题标题】:Polling every 50 seconds in multithreaded environment在多线程环境中每 50 秒轮询一次
【发布时间】:2015-06-17 21:02:57
【问题描述】:

我正在使用以下库来创建名为 pyftpdlib 的 ftp 服务器。
遵循构建基础 ftp 服务器的确切示例,除了我创建了自己的自定义处理程序并按照示例中的方式传递它。

第一个问题: 我需要能够每 50 秒对自定义处理程序中定义的静态字典(类变量)进行轮询。每间隔 50 秒后,我需要检查一些情况并采取相应措施。

您可能会看到,FTP 服务器正在使用自定义处理程序,我想我需要一些工作线程,能够每 50 秒轮询一次自定义处理程序的静态字典,我如何启动另一个线程绑定到自定义处理程序并进行这种计时器轮询?

第二个问题:有没有办法知道从静态字典读取的特定时间戳以来已经过去了 50 秒(在它过去的那一秒) - 我的意思是这样做而不是每隔 X 秒轮询一次以检查时间是否已经过去,这可能是不准确的。

【问题讨论】:

    标签: python multithreading python-2.7 timer pyftpdlib


    【解决方案1】:

    第一个问题

    在您的工作线程中,使用基于类的版本来创建线程。您将处理程序传递给对象的构造函数,并且该对象将引用您已经创建的相同自定义处理程序。

    在我的例子中,“handler”应该被包裹在一个带有互斥锁的函数中,以使其线程安全

    请注意,您可能希望将互斥锁添加到自定义处理程序以防止数据竞争并确保这是线程安全的。该代码只是为您提供一个想法的示例。如果它不能按原样工作。请告诉我。

    from threading import Thread
    from time import sleep
    
    class Worker(Thread):
        def __init__(self, custom_handler):
            self.handler = custom_handler
    
        def run(self):
            while(True):
                sleep(50)
    
                # check handler
                if self.handler:
                    # do something
                    pass
    
    
    
    handler = {}
    worker = Worker(handler)
    
    # start thread
    worker.run()
    

    第二个问题

    不知道您所说的“知道”50 秒已经过去是什么意思。这些长时间的轮询通常是通过让任务休眠给定的时间然后醒来做工作来完成的。这种方法不符合您的要求吗?但你是对的,你可能仍然会在时间上遇到一些偏差,但这是绝对要求吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2017-04-12
      相关资源
      最近更新 更多