创建线程不会死亡的ThreadPoolWorkers

时间:2019-07-07 02:15:43

标签: python-3.x multithreading python-multithreading slack-api

在我的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软件包。

1 个答案:

答案 0 :(得分:0)

这是一个XY problem.

不是我的线程没有死,而是我试图从线程退出()。

  

由于exit()最终“仅”引发异常,因此它将仅退出   从主线程调用该过程,但异常不是   被拦截。

https://docs.python.org/2/library/sys.html#sys.exit

我将出口移至主线程,并且退出正常。