【问题标题】:Python while loop, turn it on and off outside classPython while循环,在课外打开和关闭
【发布时间】:2018-02-20 15:26:57
【问题描述】:

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

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

【问题讨论】:

  • 作为线程可以共享全局变量
  • while 循环永远不会以 switch 开头的 False 开始

标签: python python-3.x


【解决方案1】:

我认为你应该在 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")

【讨论】:

    【解决方案2】:

    您的循环应该始终运行,否则您需要第二个循环来检查它是否应该运行循环 = 冗余。

    此外,您正在使用多处理库,这意味着它们不会像线程那样共享系统内部的全局变量。所以...您需要将开关保存在外部上下文(如数据库或配置文件)中,并在输出之前让循环检查。

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

    【讨论】:

    • 感谢 gevent 中有关 GIPC 的提示!
    猜你喜欢
    • 2016-10-10
    • 2023-01-19
    • 2018-08-15
    • 2020-05-27
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    相关资源
    最近更新 更多