我是线程新手。我使用4个线程在4个不同的东西上运行我的函数。现在我需要在我的函数中设置一个标志,它将对每个标志进行不同的计算。最好的方法是什么? 我正在尝试这样做,这是正确的。如果有更好的方法请建议。
def func(i,flag):
while True:
if flag==0:
something
else:
something else
flag-=1
flag=["0","0","0","0"]
try:
thread.start_new_thread( func, (10,flag[0], ) )
thread.start_new_thread( func, (11,flag[1], ) )
thread.start_new_thread( func, (12,flag[2], ) )
thread.start_new_thread( func, (13,flag[3], ) )
except:
print "Error: unable to start thread"
#after sometime
flag[0]+=1
flag[2]+=1
答案 0 :(得分:1)
我看到以下问题:
threading
代替thread
。 {3}在Python3中消失了。thread
初始化为字符串列表,但随后通过添加1(整数)来递增每个元素。那不行。flag
。您在“一段时间后”对列表所做的更改不会影响flag
中的局部变量flag
。它们是两个不同的对象。修改列表元素不会更改最初传递到func
的值,因为它是一个简单的字符串; Python中的字符串具有值(非引用)语义。尝试以下方法:
func
这是一个相当粗糙,但它做你想要的。 flag=[0,0,0,0]
def func(i,thread_index):
if flag[thread_index] == 0:
something
else:
something else
flag[thread_index] -= 1
try:
thread.start_new_thread( func, (10,0))
thread.start_new_thread( func, (11,1))
thread.start_new_thread( func, (12,2))
thread.start_new_thread( func, (13,3))
except:
print "Error: unable to start thread"
#after sometime
flag[0] += 1
flag[2] += 1
是一个全局列表,每个线程访问该列表中的唯一索引。当主线程访问列表时,您会看到flag
中的更改,因为它通过封闭容器(列表)对象访问每个元素。