Как использовать несколько потоков

У меня есть этот код:

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()