Сделать каждый поток, кроме основного, демоном (t.daemon = True
в 2.6 или лучше, t.setDaemon(True)
в 2.6 или меньше, для каждого объекта потока t
перед его запуском). Таким образом, когда основной поток получает KeyboardInterrupt, если он не перехватывает его или перехватывает его, но все равно решает прекратить работу, весь процесс завершается. См. документы .
edit : только что увидев код OP (первоначально не опубликованный) и утверждение, что «это не работает», я должен добавить ...:
Конечно, если вы хотите, чтобы ваш основной поток оставался отзывчивым (например, на control-C), не включайте его в блокировку вызовов, таких как join
в другом потоке - особенно не полностью бесполезный блокирует вызовы, такие как join
ing daemon threads. Например, просто измените последний цикл в главном потоке на текущий (полный и разрушительный):
for i in range(0, thread_count):
threads[i].join()
к чему-то более разумному, например:
while threading.active_count() > 0:
time.sleep(0.1)
если у вашего main нет ничего лучше, чем либо завершить все потоки самостоятельно, либо получить управляющий C (или другой сигнал).
Конечно, есть много других используемых шаблонов, если вы предпочитаете, чтобы ваши потоки не прерывались внезапно (как это могут быть демонические потоки) - если они тоже не навсегда прерваны в безусловно блокирующих вызовах , тупики и тому подобное; -).