我创建了一个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的例子,但我的问题很简单 - 是否真的没有简单的方法来产生一个异步线程?
答案 0 :(得分:1)
但是,你真的不应该在构造函数中生成一个线程。相反,提供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!")