在我的Slack RTM消息处理程序函数中,我正在调用一组函数中的任何一个。每个消息事件处理程序都会单独阻止下一个,因此我开始在新线程中调用这些函数。完成此操作后,我无法exit()
编写程序,对于每个被调用的消息处理程序,我只能得到一个ThreadPoolExecutor-x_x
。
即使我将线程分别设置为setDaemon=True
和.join()
,ThreadPoolExecutor仍然保留。
def exitFunc(sendfn, channel, thread, user, text, groups, groupdict, meta):
reply = 'bye'
sendfn(channel=channel, message = reply)
for thread in threading.enumerate():
print(thread.getName())
exit()
产生此结果并挂起:
MainThread
ThreadPoolExecutor-0_0
ThreadPoolExecutor-0_1
ThreadPoolExecutor-3_0
ThreadPoolExecutor-3_1
ThreadPoolExecutor-3_2
exitFunc
ThreadPoolExecutor-3_3
当我不将函数作为新线程运行时,这些ThreadPoolExecutor似乎会徘徊,但它们确实会让我的程序退出。
生成线程:
def __init__(self, token, username = None, icon_emoji = None, security = None):
...
slack.RTMClient.run_on(event='message')(self.readMessage)
def readMessage(self, **payload):
...
thread = Thread(target=fn['fn'], kwargs = fnargs)
thread.start()
作为sendfn传递的函数:
def sendMessage(self, channel, message, thread = None, username = None, icon_emoji = None):
if username == None:
username = self.default_username
if icon_emoji == None:
icon_emoji = self.default_icon_emoji
print('{} Send to {}: {}'.format(str(datetime.now()), channel, message))
self.webclient.chat_postMessage(
channel=channel,
text=message,
username=username,
icon_emoji=icon_emoji,
thread_ts=thread
)
我正在使用slackclient 2.0.1 python软件包。
答案 0 :(得分:0)
这是一个XY problem.
不是我的线程没有死,而是我试图从线程退出()。
由于exit()最终“仅”引发异常,因此它将仅退出 从主线程调用该过程,但异常不是 被拦截。
https://docs.python.org/2/library/sys.html#sys.exit
我将出口移至主线程,并且退出正常。