如何保持python进程的活力-正确的方法

如何保持python进程的活力-正确的方法,python,python-3.x,Python,Python 3.x,我经常看到这个问题,但我对答案不满意。 我知道像Django和Flask/Werkzeug这样的服务器程序有startserver/run方法,在收到停止信号之前保持进程活动 我想实现类似的东西,但我不知道如何实现。 我认为永久循环是一种不好的方法,因为它浪费了处理时间。我不想使用第三方库 我的程序必须保持活动状态以等待回调、与服务器通信、监视其内部状态等 伪代码: import ... class Main(): def __init__(): self.sensor

我经常看到这个问题,但我对答案不满意。 我知道像Django和Flask/Werkzeug这样的服务器程序有startserver/run方法,在收到停止信号之前保持进程活动

我想实现类似的东西,但我不知道如何实现。 我认为永久循环是一种不好的方法,因为它浪费了处理时间。我不想使用第三方库

我的程序必须保持活动状态以等待回调、与服务器通信、监视其内部状态等

伪代码:

import ...

class Main():
    def __init__():
        self.sensors = sensors.register()
        self.database = remote.connect()
        self.running = True

    def start():
    """ this is what I assume is bad """
        while self.running:
            pass

    def stop():
        self.running = False
        self.cleanup()

    def cleanup():
        self.database.disconnect()
        self.sensors.unregister()
你可以:

import time
time.sleep(x) #seconds
并仅在所需时间间隔检查状态

对于网络事件,可以使用套接字。 您可以:

import time
time.sleep(x) #seconds
并仅在所需时间间隔检查状态

对于网络事件,可以使用套接字。

有一个通用的范例,它不是python特有的,用于处理这种情况,称为事件循环。如果你在互联网上搜索它,你会发现几个实现它的图书馆。如果您使用的是
asyncio
,则不需要第三方库,因为python3附带了第三方库。我建议你熟悉这个概念,网络上有很多例子。参见例如教程。我们从那里得到了这个例子:

导入异步IO
异步def work():
尽管如此:
等待asyncio.sleep(1)
打印(“已执行任务”)
loop=asyncio.get\u event\u loop()
尝试:
asyncio.确保未来(工作())
loop.run_forever()
除键盘中断外:
通过
最后:
打印(“闭合循环”)
loop.close()

我希望这能有所帮助。

有一个通用的范例,它不是python特有的,用于处理这种情况,称为事件循环。如果你在互联网上搜索它,你会发现几个实现它的图书馆。如果您使用的是
asyncio
,则不需要第三方库,因为python3附带了第三方库。我建议你熟悉这个概念,网络上有很多例子。参见例如教程。我们从那里得到了这个例子:

导入异步IO
异步def work():
尽管如此:
等待asyncio.sleep(1)
打印(“已执行任务”)
loop=asyncio.get\u event\u loop()
尝试:
asyncio.确保未来(工作())
loop.run_forever()
除键盘中断外:
通过
最后:
打印(“闭合循环”)
loop.close()

我希望这会有所帮助。

您可能会发现这封旧的Python邮件列表电子邮件很有用:您可能会发现这封旧的Python邮件列表电子邮件很有用:有没有办法让流程保持活动状态而不出现循环?这似乎类似于Javascript在浏览器中侦听事件的方式(例如单击、滚动等)。在那里它也被称为事件循环。这是js和node默认为异步的主要原因。@Anders_K不,不是。进程只是一个程序,它按顺序执行命令,直到完成为止。为了启用多处理,主机操作系统提供了一种称为睡眠的功能。休眠时,进程处于空闲状态,不消耗CPU周期。在引擎盖下,事件循环使用一个循环,其中有一个短暂的睡眠,然后检查是否需要做某事,作为对事件的响应,例如信号或计时器事件。在使用事件循环时,也不用担心效率:开发人员花费了大量精力进行优化。无需重新发明轮子。是否有任何方法可以在没有循环的情况下保持进程的活力?这似乎类似于Javascript在浏览器中侦听事件的方式(如单击、滚动等)。在那里它也被称为事件循环。这是js和node默认为异步的主要原因。@Anders_K不,不是。进程只是一个程序,它按顺序执行命令,直到完成为止。为了启用多处理,主机操作系统提供了一种称为睡眠的功能。休眠时,进程处于空闲状态,不消耗CPU周期。在引擎盖下,事件循环使用一个循环,其中有一个短暂的睡眠,然后检查是否需要做某事,作为对事件的响应,例如信号或计时器事件。在使用事件循环时,也不用担心效率:开发人员花费了大量精力进行优化。不需要重新发明轮子。