Сначала делаешь 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()
Код не проверял, но наверно работает.