我不确定这是最佳做法还是其他任何东西,但是我有一个线程运行,每隔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)
我的意思是它比这复杂得多,而且粘贴在这里的时间太长了,但这是我刚刚添加的那部分不起作用的部分,我做错了什么?
答案 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.
这样你甚至可以为你的线程添加更多“行为”,你可以添加remove
,sort
等函数......
另一方面,如果您正在执行一段时间后执行的任务(在您的情况下为5秒),您应该考虑使用Timers Objects