В моей функции обработчика сообщений 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.