Python - 实现 Future 对象
Python - Implementing a Future object
我需要 python3 中的 Future 对象。
Python 有两个内置实现:
asyncio模块有一个,但是不适合我的应用。
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
虽然这里的关键是如果 get
在 set
之前调用,该方法将阻塞直到设置值。
set
正在设置值并释放任何正在等待 get
.
的线程
在多线程应用程序中使用上述内置实现之一是否安全?
如何有效地实施?
How to implement that efficiently?
我不知道效率如何,但是简单:
听起来像是一个 class,有一个 value
个成员,一个 is_set
个成员,一个 lock
和一个 condition
。 set()
方法应该
- 锁定
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
欢迎提出任何建议。
我需要 python3 中的 Future 对象。
Python 有两个内置实现:
asyncio模块有一个,但是不适合我的应用。
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
虽然这里的关键是如果 get
在 set
之前调用,该方法将阻塞直到设置值。
set
正在设置值并释放任何正在等待 get
.
在多线程应用程序中使用上述内置实现之一是否安全?
如何有效地实施?
How to implement that efficiently?
我不知道效率如何,但是简单:
听起来像是一个 class,有一个 value
个成员,一个 is_set
个成员,一个 lock
和一个 condition
。 set()
方法应该
- 锁定
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
欢迎提出任何建议。