@sergeyfk

Как изменять переменную из разных потоков?

Мне нужно запустить поток и в нем редактировать переменную, но стоит учитывать, что основной поток тоже будет с ней работать и время от времени изменять. Дайте пожалуйста пример с объяснением, ведь главное понять. Знаю что вопрос легкий и должен гуглиться легко, но на тему многопоточности на питоне как-то мало информации.
  • Вопрос задан
  • 471 просмотр
Пригласить эксперта
Ответы на вопрос 2
urtow
@urtow
*nix, python, QA, bagpipe, folk music
Никак.
Просто не надо этого делать.
Ответ написан
Комментировать
@asd111
Сначала делаешь lock, потом меняешь переменную, потом убираешь lock.
import threading
import time
import inspect

class Thread(threading.Thread):
    def __init__(self, t, *args):
        threading.Thread.__init__(self, target=t, args=args)
        self.start()

count = 0
lock = threading.Lock()

def incre():
    global count
    caller = inspect.getouterframes(inspect.currentframe())[1][3]
    print "Inside %s()" % caller
    print "Acquiring lock"
    with lock:
        print "Lock Acquired"
        count += 1  
        time.sleep(2)  

def bye():
    while count < 5:
        incre()

def hello_there():
    while count < 5:
        incre()

def main():    
    hello = Thread(hello_there)
    goodbye = Thread(bye)


if __name__ == '__main__':
    main()

Но это не лучший вариант, лучше использовать блокирующие очереди или thread local переменные.

В питоне можно использовать очень простую многопоточность из пары строк:
import requests
from multiprocessing.dummy import Pool as ThreadPool 

urls = [
  'http://www.python.org', 
  'http://www.python.org/about/',
  'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html', 
  ]

def my_get_url(url):
    result = requests.get(url)
    return result

# Делаем thread pool и указываем количество потоков
pool = ThreadPool(4) 

# Запускаем функцию my_get_url в несколько потоков на списке urls и складываем все результаты в список results
results = pool.map(my_get_url, urls)

#ждем завершения всех потоков
pool.close() 
pool.join()


Код не проверял, но наверно работает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы