2010-11-08 2 views
3

Прошу прощения, если это глупый вопрос. Я пытаюсь использовать несколько классов многопоточности для завершения разных заданий, что предполагает многократное использование этих многопотоков в разное время. Но я не уверен, какой метод использовать. Код выглядит следующим образом:Как я могу вызвать поток несколько раз в Python?

class workers1(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
    def run(self): 
     do some stuff 

class workers2(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
    def run(self): 
     do some stuff 

class workers3(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
    def run(self): 
     do some stuff 

WorkerList1=[workers1(i) for i in range(X)] 
WorkerList2=[workers2(i) for i in range(XX)] 
WorkerList2=[workers3(i) for i in range(XXX)] 


while True: 
    for thread in WorkerList1: 
     thread.run (start? join? or?) 
    for thread in WorkerList2: 
      thread.run (start? join? or?) 
    for thread in WorkerList3: 
      thread.run (start? join? or?) 
    do sth . 

Я пытаюсь иметь все нити во все WorkerList начать функционировать в то же время, или по крайней мере начать примерно в то же время. Когда-то однажды все они были прекращены, я хотел бы снова вызвать все потоки.

Если не было петли, я могу просто использовать .start; но так как я могу только начать нить один раз, начинать, по-видимому, не подходит здесь. Если я использую run, кажется, что все потоки начинаются последовательно, а не только потоки в одном списке, но также потоки из разных списков.

Может ли кто-нибудь помочь?

ответ

8

есть много неправильных представлений здесь:

  • вы можете только начать конкретный экземпляр нити один раз. но в вашем случае цикл for зацикливается на разных экземплярах потока, каждый экземпляр присваивается переменной thread в цикле, поэтому нет никакой проблемы при вызове метода start() по каждому потоку. (Вы можете думать о нем, как если переменная thread является псевдонимом Thread() объекта реализованного в списке)

  • run() не то же самое, как join(): вызов run() выполняемых, как если бы вы программировали последовательно. метод run() не запускает новый поток, он просто выполняет инструкции in в методе, как и для любого другого вызова функции.

  • join() ничего не запускает: он только ждет завершения резьбы. для того, чтобы join() работал правильно для потока, вы должны сначала позвонить start() в этой теме.

кроме того, вы не должны, что вы не можете перезапустить поток, как только он закончит выполнение: вы должны воссоздать объект потока для того, чтобы быть запущен снова. одним из способов решения этой проблемы является вызов Thread.__init__() в конце метода run(). однако я бы не рекомендовал это делать, так как это запретит использование метода join() для обнаружения конца выполнения потока.

+0

но я использую метод start() в цикле, моя программа может фактически дать мне ошибку времени выполнения, сказав, что поток уже запущен. Поэтому я не могу снова вызвать метод run в каждом потоке. – user500432

+0

Право, я отредактировал свой ответ ... –

1

Если бы вы назвали thread.start() в петлях, вы бы фактически начать все потоки только один раз, потому что все записи в списке являются различными объектами резьбы (не имеет значения, что они принадлежат к одному классу). Вы никогда не должны называть метод нити run() напрямую - он предназначен для вызова методом start(). Вызов его напрямую не будет вызывать его в отдельном потоке.

+0

Если мой поток уже запущен и закончен, как я могу снова вызвать метод запуска, встроенный в поток?Моей целью было вызывать метод run внутри каждого потока несколько раз. – user500432

+0

Метод 'run()' каждого потока вызывается только один раз. Напишите цикл внутри 'run()' или используйте шаблон производителя-потребителя, используя модуль ['queue'] (http://docs.python.org/library/queue.html). –

Смежные вопросы