Python - 实现 Future 对象

Python - Implementing a Future object

我需要 python3 中的 Future 对象。

Python 有两个内置实现:

  1. asyncio模块有一个,但是不适合我的应用。

  2. concurrent.futures 有一个,但是它的文档说明这个对象只能由 Executor 对象创建:

The following Future methods are meant for use in unit tests and Executor implementations.

https://docs.python.org/3/library/concurrent.futures.html#future-objects

基本界面为:

class Future:
   def get(self):
       pass
   def set(self, val):
       pass

虽然这里的关键是如果 getset 之前调用,该方法将阻塞直到设置值。

set 正在设置值并释放任何正在等待 get.

的线程

在多线程应用程序中使用上述内置实现之一是否安全?

如何有效地实施?

How to implement that efficiently?

我不知道效率如何,但是简单:

听起来像是一个 class,有一个 value 个成员,一个 is_set 个成员,一个 lock 和一个 conditionset() 方法应该

  • 锁定lock
  • 如果 is_set 已经为真则引发错误,否则
    • is_set = True
    • 设置值
    • condition.notifyAll()

get()方法应该加锁,然后循环等待条件变量,直到is_set为True,最后,return值。

如果有更有效的方法来使用纯 Python 代码,那超出了我的知识范围。

在@SolomonSlow 的指导下,我实现了这段代码:

from threading import Lock, Condition

class Future:
    def __init__(self):
        self.__condition = Condition(Lock())
        self.__val = None
        self.__is_set = False

    def get(self):
        with self.__condition:
            while not self.__is_set:
                self.__condition.wait()
            return self.__val

    def set(self, val):
        with self.__condition:
            if self.__is_set:
                raise RuntimeError("Future has already been set")
            self.__val = val
            self.__is_set = True
            self.__condition.notify_all()

    def done(self):
        return self.__is_set

欢迎提出任何建议。