Python 3.3 - 将变量发送给线程

时间:2014-02-24 15:26:21

标签: python multithreading python-3.x python-3.3

我不确定这是最佳做法还是其他任何东西,但是我有一个线程运行,每隔5秒激活一次,检查列表中的参数,在该线程之外我有一个while循环运行,它将插入参数使用while循环之外的函数进入列表(这部分可以正常工作),但是列表不会在线程内部更新,我将如何将其发送到线程中?

IE

def addtolist():
    mylist.extend([variable])

def myfunction():
    while True:
        if time.time() > 5 + last_time:
            last_time = time.time()
            print(mylist[0]) # doesn't print anything
        time.sleep(1)

if __name__ == "__main__":
    count_job = Thread(target = myfunction, args = ())
    count_job.start()

while True:
    variable = "Look, a fly!"
    addtolist()
    time.sleep(7)

我的意思是它比这复杂得多,而且粘贴在这里的时间太长了,但这是我刚刚添加的那部分不起作用的部分,我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的线程功能立即退出...它会执行单次时间检查,根据mylist的初始值打印last_time的第一个元素并退出。

除了你的示例代码没有显示变量初始化的方式/位置之外,你的线程函数需要看起来像这样:

def myfunction():
    while True: # loop forever
        if time.time() > 5 + last_time:
            last_time = time.time()
            print(mylist[0]) # doesn't print anything
        time.sleep(1) # wait for one second for mylist to be updated, yield to main thread

注意如果你没有在线程中添加sleep,它将在繁忙的循环中等待,而不会将控制返回到主线程(并消耗大量的CPU)。

另外,请注意线程将始终打印相同的值(mylist的第一个元素)。由于addtolist附加到列表的末尾,因此不会显示新值。您可能希望将print(mylist[0])更改为print(mylist[-1])以显示最后插入的元素。

最后,有更好的方法可以做到这一点。请参阅 17.1.5部分下的docs.python.org/3.3/library/threading.html。条件对象

答案 1 :(得分:1)

我建议您使用另一种方法来实现具有某种状态的线程。不要使用全局变量,而是使用threading.Thread继承。

例如,您的问题可以通过这种方式解决:

import threading
import time


class MyThread(threading.Thread):

    def __init__(self, some_list=None):
        super(MyThread, self).__init__()
        self.list = some_list if some_list is not None else []
        self.event = threading.Event()     # Used for stop the thread

    def run(self):
        while not self.event.isSet():
            # Do your thread thing here.
            time.sleep(1)
            print(self.list)


    def add_elem(self, elem):
        self.list.append(elem)  # Extend or append, is up to you.

    def stop(self):
        self.event.set()


if __name__ == '__main__':

    thread = MyThread()     # Thread instance.
    thread.start()          # Start the thread.
    thread.add_elem(10)     # Add some element.
    time.sleep(3)           # Wait 3 secs.
    thread.add_elem(100)    # Add another element.
    time.sleep(3)           # Wait 3 secs.
    thread.stop()           # Stop thread.

这样你甚至可以为你的线程添加更多“行为”,你可以添加removesort等函数......

另一方面,如果您正在执行一段时间后执行的任务(在您的情况下为5秒),您应该考虑使用Timers Objects