ThreadPoolWorkers, которые не умрут, если они создадут поток - PullRequest
0 голосов
/ 07 июля 2019

В моей функции обработчика сообщений Slack RTM я вызываю любую из набора функций. В одиночку каждый обработчик сообщений блокирует следующий, поэтому я начал вызывать эти функции в новых потоках. После этого я не могу exit() моей программы, у меня остается ThreadPoolExecutor-x_x для каждого из вызванных обработчиков сообщений.

Даже если я установлю для своих потоков setDaemon=True и .join() для них, ThreadPoolExecutors остаются.

    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

Когда я не запускаю функцию как новый поток, эти ThreadPoolExecutors, кажется, зависают, но они позволяют моей программе завершиться.

Нерестовые нити:

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.

1 Ответ

0 голосов
/ 09 июля 2019

Это была проблема XY.

Дело не в том, что мои потоки не умирали, а в том, что я пытался выйти () из потока.

Поскольку exit () в конечном итоге «только» вызывает исключение, он будет выходить из процесса только при вызове из основного потока, и исключение не перехватывается.

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

Я перенес свой выход в основной поток, и он вышел нормально.

...