Python while循环,在课堂外打开和关闭它

时间:2018-02-20 15:26:58

标签: python python-3.x

我对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)

所以可能有很多方法可以做到这一点,但无法弄清楚什么是最简单的方法。非常感谢。

2 个答案:

答案 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打开多个进程以及每个进程内的异步线程并在它们之间共享状态。它运作得非常好。