在类Init上每X秒执行一次函数

时间:2012-02-28 00:10:24

标签: python multithreading

我创建了一个jabberbot类,我想广播预定的消息。我对线程(使用任何语言)没有多少经验,但我很难用python来掌握这个概念。

我最直接的尝试是使用threading.timer这样的东西:

class myBot(JabberBot):
     def __init__( self, jid, password, res = none):
         autoNotify()

      def autoNotify():
           #Send timed message
           self.send('someuser@jabber.example.com','cooool message text!')
           #set/reset timer
           t = Timer(05,self.autoNotify)
           t.start()

这个问题是它不断产生新的线程,直到它最终死亡。我已经阅读了很多关于使用第三方库,消息队列和扭曲的SO的例子,但我的问题很简单 - 是否真的没有简单的方法来产生一个异步线程?

1 个答案:

答案 0 :(得分:1)

Yes, there is

但是,你真的不应该在构造函数中生成一个线程。相反,提供run方法并从threading.Thread继承,这将使公共start方法可用于启动通知循环。像这样:

import threading
import time

class myBot(JabberBot, threading.Thread):
  def __init__( self, jid, password, res = none):
    threading.Thread.__init__(self)

  def run(self):
    while True:
      self.autoNotify()
      time.sleep(5) # wait 4 seconds

  def autoNotify(self):
    self.send('someuser@jabber.example.com','cooool message text!')

像这样使用:

 myBot(...).start()

如果由于某种原因你不能或不想使用多重继承,你也可以这样做:

class myBot(JabberBot):
  def start(self):
    threading.Thread(target=self.autoNotifyLoop).start()

  def autoNotifyLoop(self):
    while True:
      self.autoNotify()
      time.sleep(5) # wait 4 seconds

  def autoNotify(self):
    self.send('someuser@jabber.example.com','cooool message text!')

您还可以为此创建一个功能,以获得最大的“便利”:

def call_async(func, *args, **kw):
  threading.Thread(target=func, args=args, kwargs=kw).start()

def do_something(msg):
  print msg

call_async(do_something, "Don't overuse threads!")