在多线程环境中每50秒轮询一次

时间:2015-06-17 21:02:58

标签: python multithreading python-2.7 timer pyftpdlib

我正在使用以下lib创建名为pyftpdlib的ftp服务器 按照构建基本ftp服务器的确切示例,除了我已经创建了自己的自定义处理程序并在示例中传递它。

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

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

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

1 个答案:

答案 0 :(得分:0)

第一个问题

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

在我的例子中," 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秒已经过去了。这些长持续时间的轮询通常通过使任务睡眠一段给定的时间然后醒来开始工作来完成。这种方法不符合您的要求吗?但你是对的,你的时间可能还会有所不同,但这是绝对的要求吗?