Python 只访问一次变量

Python 只访问一次变量,python,yield,Python,Yield,我们有这样一个函数: def infinite_sequence(): num = 0 while True: yield num time.sleep(1) num += 1 以下代码: for num in infinite_sequence(): print(num) 将导致打印以下内容: 0 1 2 3 4 ... 现在假设infinite_sequence()在后台运行,我只需要打印实际的num变量 运行无限_序列()一分钟后,

我们有这样一个函数:

def infinite_sequence():
  num = 0
  while True:
    yield num
    time.sleep(1)
    num += 1
以下代码:

    for num in infinite_sequence():
      print(num)
将导致打印以下内容:

0
1
2
3
4
...
现在假设infinite_sequence()在后台运行,我只需要打印实际的num变量

运行无限_序列()一分钟后,结果应该是60


我如何做到这一点?

生成器不能自己“运行”(在后台或其他地方)。但如果线程在其上迭代(处理延迟可以忽略不计),它也可以将该值存储在某个位置:

def stash(it,box):
  for x in it:
    box[0]=x
    # more fast operations on x…

# elsewhere
box=[None]
th=threading.Thread(target=stash,args=(infinite_sequence(),box))
th.start()
while …:
  latest=box[0]
  # operate on latest

至少在使用CPython时,对列表元素的非同步访问是安全的,当然在使用它之前它可能已经过时。

您只想打印最后一个值?听起来像是XY问题。如果您想知道“动作X”已经过去了多少秒,只需使用时间戳跟踪它。您甚至可以将其包装在一个类中,然后使用同一个实例查询“自动作X起的秒数”;如何“停止”
infinite_sequence
?您需要一个单独的执行线程来更新一个共享变量,您可以独立查询。没有生成“last”值。这些值仅在您请求时生成。它们不是提前生成的,因此没有“当前”值,也不会存储在任何地方,以便您可以请求以前生成的值。这听起来确实像是个XY问题。您有问题X,并且您正在询问尝试的解决方案Y(休眠的生成器)。你能告诉我们关于问题X的情况吗?