python - 对象销毁和过程

标签 python multithreading

所以我为 Web API 编写了一个包装器 WebApiSession。创建实例时,将完成登录等操作并创建 session 。 session 需要保持事件状态,因此构造函数会启动一个单独的进程来处理此问题。 close() 方法注销 session 并停止进程。现在理想情况下我不想调用 close()。相反,我希望在不再需要实例时发生这种情况,即我希望能够删除下面的 session.close() 调用。这可能吗?

import time
from multiprocessing import Process

class WebApiSession:
    def __init__(self):
        # start session, login etc
        # ...
        # start touch loop
        self.touchLoop = Process(target = self.runTouchLoop)
        self.touchLoop.start()
    def runTouchLoop(self):
        self.touch()
        time.sleep(1)
        self.runTouchLoop()
    def touch(self):
        # touch session
        pass
    def close(self):
        # logout etc
        # ...
        self.touchLoop.terminate()
    def doSomething(self):
        pass

if __name__ == '__main__':
    session = WebApiSession()
    session.doSomething()
    session.close()

最佳答案

听起来您可以从实现 WebApiSession as a context manager 中受益。 。然后,您可以像对待任何其他“上下文”一样对待您的 session ​​,这些“上下文”具有在打开和关闭时必须调用的特殊方法,例如文件或其他连接。它还会给你带来额外的好处,比如整齐地总结错误等等。

class WebApiSession(object):
    def __init__(self):
        pass # other init stuff here, but don't connect yet.

    def __enter__(self): # entering the context.
        # start session, login, start touch loop
        self.touchLoop = Process(target = self.runTouchLoop)
        self.touchLoop.start()
        return self
    def __exit__(self, exc_type, exc_val, traceback): # leaving the context.
        # Bonus feature: handle exception info here as needed!
        self.close()


if __name__ == '__main__':
    with WebApiSession() as session:
        session.doSomething()

关于python - 对象销毁和过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22547125/

相关文章:

c# - C# Parallel.ForEach 是否对集合的迭代使用相同的线程

python - keras 层在每个 epoch 重新启动一部分权重

php - 命令行命令在Python中不起作用-不发送文件

python - 在 pyOpenGL 中对齐各个对象以创建更大的聚合对象

c++ - 如何在线程完成后运行我的 Qt 函数?

java - 给定列表中的百万数字。如何以最小的时间复杂度将每个元素乘以一个常数

java - 在 Java 中处理 N 个线程上的 M 个慢速计算

python - 带有时间戳标记的 UsernameToken || python || WS-安全性 (WSSE)

python - Django 与 Heroku : Getting started

objective-c - performSelectorInBackground 和 NSOperation 子类的区别