Как использовать несколько потоков
У меня есть этот код:
import thread
def print_out(m1, m2):
print m1
print m2
print "\n"
for num in range(0, 10):
thread.start_new_thread(print_out, ('a', 'b'))
Я хочу создать 10 потоков, каждый поток выполняет функцию print_out
, но я потерпел неудачу. Ошибки заключаются в следующем:
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
Ответы
Ответ 1
Прежде всего, вы должны использовать модуль более высокого уровня threading
и, в частности, класс Thread
. Модуль Thread
не то, что вам нужно.
По мере расширения этого кода вы, скорее всего, также захотите дождаться завершения потоков. Ниже приведен пример использования метода join
для достижения этого:
import threading
class print_out(threading.Thread):
def __init__ (self, m1, m2):
threading.Thread.__init__(self)
self.m1 = m1
self.m2 = m2
def run(self):
print self.m1
print self.m2
print "\n"
threads = []
for num in range(0, 10):
thread = print_out('a', 'b')
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
Ответ 2
Вы должны позволить основному нитку оставаться в живых ненадолго. Если основной поток затухает, так будут и все остальные потоки, и, следовательно, вы не увидите никакого выхода. Попробуйте добавить time.sleep(0.1)
в конце кода, а затем вы увидите вывод.
После этого вы можете взглянуть на thread.join()
, чтобы получить больше информации об этом.
Ответ 3
В другом подходе используется класс потоковой передачи.
instance[num]=threading.Thread(target=print_out, args=('a', 'b'))
instance[num].start()