我对Python很陌生,只是无法弄清楚我是如何工作的。
我想要的是一个背景while循环打印每一秒的东西,但可以在我想要的时候关闭它。 对于这个例子,我只想让它开启前4秒,关闭4秒后(所以没有实际发生)。我将它作为一个过程运行。
#!/usr/bin/env python
import sys
import os
from multiprocessing import Process
from time import gmtime, strftime,sleep
## Start with false
switch = False
def logstate():
switchT = switch
while (switchT == True):
print('state')
sleep(1)
switchT = switch
if __name__ == '__main__':
# start process
p1 = Process(target=logstate())
p1.start()
p1.join()
# switch on
switch = True #?
sleep(4)
# switch off
switch = False #?
sleep(4)
所以可能有很多方法可以做到这一点,但无法弄清楚什么是最简单的方法。非常感谢。
答案 0 :(得分:2)
我认为你应该在Thread
中运行while循环from threading import Thread
from time import sleep
SHOULD_LOOP = False
def threaded_function():
while True:
if not SHOULD_LOOP: continue
print('state')
sleep(1)
if __name__ == "__main__":
thread = Thread(target = threaded_function)
thread.start()
while True:
SHOULD_LOOP = True
sleep(4)
SHOULD_LOOP = False
sleep(4)
thread.join()
print ("thread finished...exiting")
答案 1 :(得分:1)
你的循环应该总是运行,否则你需要第二个循环来检查它是否应该运行循环=冗余。
此外,您正在使用多处理库,这意味着它们不会像线程一样在系统内共享全局变量。所以......您需要将交换机保存在外部环境中(如DB或配置文件),并在输出之前进行循环检查。
def logstate():
while 1:
with open('myfile.txt', 'r') as f:
switch = f.readline()
if switch.lower() == "true":
print('state')
sleep(1)
以上是上述问题。睡眠会阻止线程。你真的应该考虑上下文切换,比如gevent。
附加选项,如果你去gevent,你可以使用GIPC打开多个进程以及每个进程内的异步线程并在它们之间共享状态。它运作得非常好。