2016-10-01 3 views
0

У меня есть этот скрипт:Python Threads, почему потоки в двух измерениях не работают?

import threading 
import time 
import sys 

def threadWait(d1, d2): 
    global number 
    time.sleep(1) # My actions 
    number = number+1 # Count of complete actions +1 
    sys.stdout.write("\033[K") # Clean line to the end. 
    sys.stdout.write(str(number)+" (Thread "+str(d1)+", "+str(d2)+") done"+"\r") # Write number and carriage return. 
    sys.stdout.flush() 

number = 0 # Count of complete actions 
threadsToJoin = [] 

dimension1 = [] # Main action task. 
for i in range(50): # I have 50 "Main Actions" I need to do in parallel threads. 
    d1 = i 
    dimension2 = [] # I need to do each "Main Action" in 10 threads. 
    for n in range(10): 
     d2 = n 
     dimension2.append(threading.Thread(target=threadWait, args=(d1,d2))) 

    dimension1.append(dimension2) 




for item in dimension1: 
    for items in dimension2: 
     # But I can't do more than 100 Threads at once. 
     while True: 
      # Analogue of BoundedSemaphore. 
      if (int(threading.activeCount()) < 100): 
       items.start() 
       threadsToJoin.append(items) 
       break 
      else: 
       continue 

for this in threadsToJoin: 
    this.join() 

Но я получаю сообщение об ошибке о «Тема не может быть запущен в два раза». Но когда я добавляю все темы в dimension2 и работает так:

for item in dimension2: 
    # But I can't do more than 100 Threads at once. 
    while True: 
     # Analogue of BoundedSemaphore. 
     if (int(threading.activeCount()) < 100): 
      item.start() 
      break 
     else: 
      continue 

Everythin будет хорошо, как excpected. Что не так с первым примером и как я могу выполнить всю потоковую обработку (многопоточность), как они это делают сейчас?

ответ

2

Что вы имеете в виду здесь:

for item in dimension1: 
    for items in dimension2: 

ли вы имеете в виду:

for item in dimension1: 
    for items in item: 

Я полагаю, вы не хотите запускать потоки в [dimension2] каждый цикл

+0

Это такая глупая ошибка 0_O Извините, иногда мне нужно взять сон кошки, чтобы очистить свой разум. – passwd

2

Ваш вложенная цикл итерации над чем-то другим, чем вы думаете:

for item in dimension1: 
    for items in dimension2: 
     # But I can't do more than 100 Threads at once. 

Задайте себе вопрос, задан ли dimension2?
Если вам трудно понять, вот ответ:

for i in range(50): # I have 50 "Main Actions" I need to do in parallel threads. 
    d1 = i 
    dimension2 = [] # I need to do each "Main Action" in 10 threads. 

После программы уходит первые вложенные циклы (те, где вы создаете «измерение» в) переменная dimension2 имеет значение из последней итерации for i in range(50) цикла , Решение проблемы вы должны сделать это включает в себя:

for dimension2 in dimension1: 
    for items in dimension2: 
     # But I can't do more than 100 Threads at once. 

Сама причина вашей проблемы пытается повторно использовать имена переменных в другом контексте. Однако список, который вы строите в dimension2, не имеет понятия имени переменной, где он хранится.

+0

Thanx! Я действительно сделал тупую логическую ошибку: D Есть ли лучший способ запуска потоков? Может быть, более современные способы? – passwd

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