【问题标题】:Background infinite loop in pythonpython中的后台无限循环
【发布时间】:2020-12-06 13:50:25
【问题描述】:

使用 python 3.8.5,我尝试创建一个具有内部无限循环的类对象,该循环将更新我以后必须读取的值...不幸的是,我在这个领域的知识有点差.

本次试验的目的是将具有状态的应用与我制作的 gui 分离...

这是我做的一个不工作的试验。

import asyncio
from time import sleep


class value_holder:
    def __init__(self):
        self.value = 0
        asyncio.create_task(self.infinite_loop())
    
    async def infinite_loop(self):
        while True:
            self.value += 1 
            sleep(3)


v = value_holder()

while True:
    print(v.value)
    sleep(1)

我实际上一无所知,所以如果有人有任何线索或关键字可以帮助我寻找解决方案,我将非常感激

最好的问候

【问题讨论】:

  • 你的问题到底是什么?
  • 主要问题是:使用我给出的示例代码,我怎样才能让一个类嵌套他自己的进程,而不会阻塞程序其余部分的执行?此外,这种问题是否有某种术语?为了方便我用好的关键字进行研究
  • dissociate an app which has a state from the gui i've made. - 在单独的进程中运行应用程序并通过队列、管道或套接字进行通信?
  • asyncio 是一个异步进程——听起来你想要并发执行https://docs.python.org/3/library/multiprocessing.html

标签: python python-3.x multithreading loops asynchronous


【解决方案1】:

您可以使用计时器来代替:

import threading
from time import sleep

class value_holder:
    value = 0
    timer = None
    delay = 1

    def __init__(self, delay):
        self.value = 0
        self.delay = delay

    def run(self):
        self.value += 1
        print(self.value)
        if self.timer != None: self.start()

    def start(self):
        self.timer = threading.Timer(self.delay, self.run) 
        self.timer.start()

    def stop(self):
        self.timer.cancel()

v = value_holder(3.0)
v.start()
sleep(9) #==> 1, 2, 3
v.stop()
print("Stopped")

【讨论】:

  • 感谢您的回答!我通过将打印值放在类之外进行了一些修改以验证答案,并且似乎可以实时读取该值,所以它可以工作。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2013-10-12
  • 2017-10-13
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
相关资源
最近更新 更多