2016-08-22 167 views
0

我正在尝试访问正在不断更新的变量,在while循环中不同的文件中。这里是我用于测试的代码:如何访问正在while循环中更新的变量

# file1  
import time 
x = 0 
while True: 
    x += 1 
    time.sleep(2.0) 

# file2 
from file1 import x 
print x 

当我运行file2时,它从头开始while循环。我想访问x的一个实例。例如,如果x = 10,我想要file2打印10.这可能吗?

+2

除非您明确创建多个线程或进程,否则Python程序将只有一个执行线程。在你的例子中,解释器将开始执行file2并进入import语句。现在执行将移至file1,导入'time'模块并打开while循环。这是一个无限循环,所以它不会完成,并且不会再有file2中的其他语句。 –

+1

这是可能的,但不使用导入系统。导入必须等到该过程完成(在模块范围内将永远挂起该无限循环)。您必须将其写出到数据库或文件并从那里加载。 –

回答

1

您可以尝试以下操作。首先,因为存在无限循环,所以导入file1将会阻塞,所以您应该在一个线程中运行循环。其次,你可以包装在一个列表递增的整数(或任何其他类型的对象),所以你可以使用参考其当前值(否则你将被导入值不是一个引用):

# file1  
import time 
import threading 

x = [0] 

def update_var(var): 
    while True: 
     var[0] += 1 
     time.sleep(2.0) 

threading.Thread(target=update_var, args=(x,)).start() 

# file2 
from file1 import x 
print x[0] 
2

我不太清楚你的意思。您是否想要f​​ile1运行,并且无限期地每2秒递增一次“x”的值,并且在任何时候运行file2时,都会从运行“file1”的程序/ python实例中提取当前值“x” ?

如果是这样,这不是你将如何处理它。使用file2,您将从file1中提取set变量x = 0。你需要做的是具有某种形式的IPC(进程间通信),以便file2可以从file1访问“x”的值。你可以通过多种方式做到这一点,包括共享内存,Redis或Memcached之类的键/值存储程序,数据库等。

如果你想通过redis或memcached来做,只需运行redis,使用Python的redis库,并且每2秒调用一次密钥“x”的.incr方法。然后,当您运行file2时,调用.get方法获得键“x”,您将获得当前值。当file1运行时,它将继续增加x;当它不是时,它不会并且将有效地冻结。但是,redis会将内存中最后一个已知值保留为“x”键。

要做到这一点与数据库,你可以实现一个MySQL数据库/表,并每2秒增加一个表中的键列中的“x”的值。你必须看看Python的mySQL库。

要做到这一点与共享内存,看看Python的共享内存功能。

还有很多其他的方式来共享数据。您可以简单地通过打开它,写入新值,刷新并关闭它,每2秒将“x”的值写入文件。然后简单地让file2读取该文件。当然,这样你就会遇到竞争条件问题,它在更新文件之前读取文件并获得一个陈旧值,这些都取决于该文件在那个时候从该进程写入该文件的优先级。

+0

我认为OP可能只是想使用线程,但从问题中不清楚。 –

+0

我也这么想,但如果不是,他想要使用两个独立的进程,我会说这些是一些很好的方法。根据他需要做什么,文件方法可以工作,但在我的情况下,我会使用redis来帮助原子性 – Brendan

+0

感谢您的彻底回应。我将使用线程,但你的答案教会了我很多。再次感谢。 – Jakub