Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中将参数传递给正在运行的线程_Python_Multithreading - Fatal编程技术网

如何在python中将参数传递给正在运行的线程

如何在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.

我是穿线新手。我使用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

我看到以下问题:

  • 使用
    线程
    而不是
    线程
    <代码>线程在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”,因为它有清晰的解释和很好的示例。