2016-10-01 60 views
0

我有这样的脚本:Python线程,为什么两个维度的线程都不起作用?

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 

对一切会好excpected。第一个例子有什么问题,我如何像现在这样完成整个线程(多线程)?

回答

2

你是什么意思在这里:

for item in dimension1: 
    for items in dimension2: 

你的意思是:

for item in dimension1: 
    for items in item: 

我想你不想在[维度2]每个周期

+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

相关问题