Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何访问while循环中正在更新的变量_Python_While Loop - Fatal编程技术网

Python 如何访问while循环中正在更新的变量

Python 如何访问while循环中正在更新的变量,python,while-loop,Python,While Loop,我试图访问另一个文件中的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。这可能吗?我不太清楚你的意思。您是否希望file1运行,并且每2秒无限期地

我试图访问另一个文件中的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。这可能吗?我不太清楚你的意思。您是否希望file1运行,并且每2秒无限期地增加x的值,并且当您随时运行file2时,它会从运行file1的程序/python实例中提取x的当前值

如果是这样,你就不会这么做。对于文件2,您正在从文件1中提取设置变量x=0。您需要做的是进行某种形式的IPC进程间通信,以便file2可以从file1访问x的值。您可以通过多种方式实现这一点,包括共享内存、redis或memcached等键/值存储程序、数据库等

如果您想通过redis或memcached执行此操作,只需运行redis,使用Python的redis库,并每隔2秒调用键x的.incr方法。然后,当您运行file2时,调用键x的.get方法,您将获得当前值。当file1运行时,它将继续递增x;当它不是的时候,它不会也将有效地冻结。但是,redis将保留x键在内存中的最后一个已知值

要对数据库执行此操作,可以实现一个mySQL数据库/表,并每隔2秒增加表中键列中的x值。您必须查看Python的mySQL库

要使用共享内存,请查看Python的共享内存函数


还有许多其他方法可以共享数据。只需打开、写入新值、刷新和关闭文件,就可以每2秒将x的值写入文件。然后让file2读取该文件。当然,这样会出现争用条件的问题,即它在文件更新之前读取文件并获得一个过时的值,所有这些都取决于操作系统文件系统在该过程中对该文件的写入优先级。

我不太清楚您的意思。您是否希望file1运行,并且每2秒无限期地增加x的值,并且当您随时运行file2时,它会从运行file1的程序/python实例中提取x的当前值

如果是这样,你就不会这么做。对于文件2,您正在从文件1中提取设置变量x=0。您需要做的是进行某种形式的IPC进程间通信,以便file2可以从file1访问x的值。您可以通过多种方式实现这一点,包括共享内存、redis或memcached等键/值存储程序、数据库等

如果您想通过redis或memcached执行此操作,只需运行redis,使用Python的redis库,并每隔2秒调用键x的.incr方法。然后,当您运行file2时,调用键x的.get方法,您将获得当前值。当file1运行时,它将继续递增x;当它不是的时候,它不会也将有效地冻结。但是,redis将保留x键在内存中的最后一个已知值

要对数据库执行此操作,可以实现一个mySQL数据库/表,并每隔2秒增加表中键列中的x值。您必须查看Python的mySQL库

要使用共享内存,请查看Python的共享内存函数


还有许多其他方法可以共享数据。只需打开、写入新值、刷新和关闭文件,就可以每2秒将x的值写入文件。然后让file2读取该文件。当然,这样会出现争用条件的问题,即它在文件更新之前读取文件并获得一个过时的值,所有这些都取决于操作系统文件系统在该进程中对该文件的写入优先级。

您可以尝试以下方法。首先,由于存在和无限循环,导入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]

您可以尝试以下方法。首先,由于存在和无限循环,导入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]

除非显式创建多个线程或进程,否则Python程序将只有一个执行线程。在您的示例中,解释器将开始执行file2并进入import语句。现在执行将移动到file1,导入时间模块并点击while循环。这是一个无限循环,所以
它将不会完成,并且永远不会到达file2中的进一步语句。这是可能的,但不使用导入系统。导入必须等到进程完成,这将永远挂起模块范围内的无限循环。除非您显式地创建多个线程或进程,否则Python程序将只有一个执行线程。在您的示例中,解释器将开始执行file2并进入import语句。现在执行将移动到file1,导入时间模块并点击while循环。这是一个无限循环,因此它不会结束,并且永远不会到达file2中的进一步语句。这是可能的,但不使用导入系统。导入必须等到进程完成,这将永远挂起模块范围内的无限循环。您必须将其写入数据库或文件,然后从那里加载。我认为OP可能只是想使用线程,但问题不清楚。我也这么想,但如果不是,他想使用两个独立的进程,我认为这是一些很好的方法。根据他需要做什么,file方法可以工作,不过在我的例子中,我会使用redis来帮助原子库进行彻底的响应。我会使用线程,但你的回答教会了我很多。再次感谢。我想OP可能只是想使用线程,但问题不清楚。我也这么想,但如果不是,他想使用两个独立的进程,我认为这是一些很好的方法。根据他需要做什么,file方法可以工作,不过在我的例子中,我会使用redis来帮助原子库进行彻底的响应。我会使用线程,但你的回答教会了我很多。再次感谢。