python 中具有线程的全局变量
Global Variables with threading in python
通过线程化进程,如以下代码所示:
import threading
import time
def loop():
global bbcount
bbcount = 0
while True:
bbcount += 1
print "This is a Loop"
time.sleep(1)
if __name__ == '__main__':
t = threading.Thread(target=loop)
t.start()
while True:
user_input = raw_input("Please enter a value:")
print "User input: " + user_input
print "Current count: " + str(bbcount)
t.join()
我是否 运行 尝试在递增循环时打印部分 updated/incremented 内存 space 来破坏 bbcount 的风险?
看完后我想到了这个:
由于进程的所有线程都共享相同的全局变量,因此会出现同步访问全局变量的问题。例如,假设您有一个全局变量 X 和两个线程 A 和 B。假设线程 A 和 B 只会增加 X 的值。当线程 A 开始执行时,它将 X 的值复制到寄存器中并增加它.在有机会将值写回内存之前,该线程被挂起。下一个线程启动,读取与第一个线程读取的相同的 X 值,将其递增并将其写回内存。然后,第一个线程完成执行并将其值从寄存器写回内存。这两个线程完成后,X 的值将增加 1,而不是像您预期的那样增加 2。
由于 GIL,该程序 运行 符合预期。
关于 GIL 的更多信息:https://en.wikipedia.org/wiki/Global_Interpreter_Lock
所以全局变量将在短时间内线程安全编辑。
通过线程化进程,如以下代码所示:
import threading
import time
def loop():
global bbcount
bbcount = 0
while True:
bbcount += 1
print "This is a Loop"
time.sleep(1)
if __name__ == '__main__':
t = threading.Thread(target=loop)
t.start()
while True:
user_input = raw_input("Please enter a value:")
print "User input: " + user_input
print "Current count: " + str(bbcount)
t.join()
我是否 运行 尝试在递增循环时打印部分 updated/incremented 内存 space 来破坏 bbcount 的风险?
看完后我想到了这个: 由于进程的所有线程都共享相同的全局变量,因此会出现同步访问全局变量的问题。例如,假设您有一个全局变量 X 和两个线程 A 和 B。假设线程 A 和 B 只会增加 X 的值。当线程 A 开始执行时,它将 X 的值复制到寄存器中并增加它.在有机会将值写回内存之前,该线程被挂起。下一个线程启动,读取与第一个线程读取的相同的 X 值,将其递增并将其写回内存。然后,第一个线程完成执行并将其值从寄存器写回内存。这两个线程完成后,X 的值将增加 1,而不是像您预期的那样增加 2。
由于 GIL,该程序 运行 符合预期。
关于 GIL 的更多信息:https://en.wikipedia.org/wiki/Global_Interpreter_Lock
所以全局变量将在短时间内线程安全编辑。