如何在python中将参数传递给正在运行的线程
我是穿线新手。我使用4个线程在4种不同的东西上运行我的函数。现在,我需要在我的函数中设置一个标志,该标志将对每个函数执行不同的计算。最好的方法是什么? 我正试着这么做,对吗。如果有更好的方法,请建议如何在python中将参数传递给正在运行的线程,python,multithreading,Python,Multithreading,我是穿线新手。我使用4个线程在4种不同的东西上运行我的函数。现在,我需要在我的函数中设置一个标志,该标志将对每个函数执行不同的计算。最好的方法是什么? 我正试着这么做,对吗。如果有更好的方法,请建议 def func(i,flag): while True: if flag==0: something else: something else flag-=1 flag=["0","0","0","0"] try: thread.
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
我看到以下问题:
线程
而不是线程
<代码>线程在Python3中消失标志初始化为字符串列表,然后通过添加1(整数)来增加每个元素。那不行
标志
不可见。您对列表“after time”所做的更改不会影响func
中的局部变量flag
。它们是两个不同的对象。修改列表元素不会更改最初传递到func
的值,因为它是一个简单的字符串;Python中的字符串具有值(而不是引用)语义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
是一个全局列表,每个线程访问该列表中的唯一索引。当主线程访问列表时,您会在func
中看到更改,因为它通过封闭容器(list)对象访问每个元素。我不确定您实际想要完成什么。您真的需要向正在运行的线程传递一个值,还是希望每个线程执行不同的操作?使用队列将数据从主循环交换到线程。在线程init中传递一个队列对象,并在while循环中读取。在我看来没问题。我用int n参数化一个worker函数,它在函数列表中运行fun[n]()。@weirdev是的,我需要将一个值传递给一个或多个线程。最初,所有线程在四个不同的对象上执行相同的函数。在我发送一个标志后,一个或多个线程执行不同的操作一段时间,然后它们将返回。@SmartElectron,我已经尝试过了。有没有更好的办法呢?谢谢你的回复。除此之外,还有其他办法解决这个问题吗。我准备好用任何比这更好的方法了。蒂娅,我不知道该怎么回答。有很多方法可以做到这一点,包括队列、锁、事件和线程模块中记录的所有其他设备。这里讨论的方法没有本质上的错误,只是不太通用。我推荐Alex Martelli的“简而言之的Python”,因为它有清晰的解释和很好的示例。