2015-07-29 2 views
0

, продев процесс, как в этом коде:глобальные переменные с потоками в 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() 

ли я рискуем bbcount быть поврежден, пытаясь напечатать частично обновленный/увеличивается объем памяти в то же время увеличивается цикл ?

Я подумал об этом после прочтения: Поскольку все потоки процесса имеют одни и те же глобальные переменные, возникает проблема с синхронизацией доступа к глобальным переменным. Например, предположим, что у вас есть глобальная переменная X и два потока A и B. Предположим, что потоки A и B просто увеличивают значение X. Когда поток A начинает выполнение, он копирует значение X в регистры и увеличивает его , Прежде чем он получит возможность записать значение обратно в память, этот поток приостанавливается. Следующий поток начинается, считывает одно и то же значение X, которое считывает первый поток, увеличивает его и записывает обратно в память. Затем первый поток завершает выполнение и записывает свое значение из регистра обратно в память. После завершения этих двух потоков значение X увеличивается на 1 вместо 2, как и следовало ожидать.

от: http://www.linuxjournal.com/article/3138

ответ

0

Из-за GIL, эта программа будет работать ожидаемо.

Подробнее о GIL: https://en.wikipedia.org/wiki/Global_Interpreter_Lock

Так глобальные переменные будут поточно-редактирование в течение короткого времени.

+0

Полезно знать, спасибо. –

Смежные вопросы