我有一个计数函数,我想开始和重新启动,而得到活变量在另一个函数中使用,我的问题是,而使用线程,它看起来像甚至全局变量似乎不工作传递变量。我想要的代码做的是有一个计数器被触发根据需要,或者可能自由运行,我还不确定。能够重置计数器并获得计数器的值。
现在计数器将启动并运行良好,但print_stuff
函数一直告诉我没有属性countval
。
计数线程在启动时开始,但我不一定希望它立即启动,我想根据需要触发它,但我不能把count_thread.start()
两次或它会通过一个错误,所以我在启动时调用线程,然后调用函数再次根据需要重新启动它。也许有一种更优雅的方法。
import threading
import time
def count():
global countval
for countval in range(3):
print('looping')
time.sleep(1)
def print_stuff():
global countval
e = input("press enter to start")
count()
while True:
if countval == 3:
print("time out")
count_thread = threading.Thread(target=count)
print_thread = threading.Thread(target=print_stuff)
print_thread.start()
count_thread.start()
print_stuff
越来越count
前if
声明函数可以创建变量。按相反的顺序来做。或者创建一个全局的countval = 0
来开始。
要解决无属性的问题,可以使用Queue
,如果你想停止你的计算线程可以设置一个全局变量或者你可以传递一个函数(使用lambda
inner function
或…)。
这里有一种方法:
import threading
import time
from queue import Queue
from typing import Callable
def count(q, stop_counting):
# type: (Queue, Callable[[], bool]) -> None
for countval in range(3):
if stop_counting():
print('stopped')
break
print(f'looping {countval}')
q.put(countval)
time.sleep(1)
def print_stuff(q):
# type: (Queue) -> None
while True:
countval = q.get()
print(f'countval gotten: {countval}')
if countval == 3:
print("time out")
def main():
flag_stop_counting = False
q = Queue()
def stop_counting():
return flag_stop_counting
count_thread = threading.Thread(target=count, args=(q, stop_counting,))
print_thread = threading.Thread(target=print_stuff, args=(q,))
print_thread.start()
count_thread.start()
time.sleep(1.25)
flag_stop_counting = True
if __name__ == '__main__':
main()
在此代码中:
counter
检查是否应该停止计数counter
将其设置的值赋给q
print_stuff
从q
获得值(注意:他等待直到计数器将他的值放入q
)
检查程序是否工作:
- 在1.25秒后我们改变
flag_stop_counting
的值
但是如果你想让你的计数器只有一个for,我想最好不要把它作为一个线程,并在你想要的时候运行它。
希望对你有帮助。