多线程 python threading 简单锁/互斥锁

 

测试代码:

#!/usr/bin/python
# coding:utf8
import threading
import time


num = 0 
def run(n):
    print 'this is %s num' % n
    global num 
    time.sleep(1)
    num += 1


for i in range(200):
    t = threading.Thread(target=run, args=(i,))
    t.start()


print num

结果:

image

num 为什么没有添加呢? 主要是主进程没有等待该子进程执行完毕就stop了, 所以要等待所有的子进程执行完毕后再结束主进程

#!/usr/bin/python
# coding:utf8
import threading
import time

p_list = []
num = 0
def run(n):
    print 'this is %s num' % n
    global num
    time.sleep(1)
    num += 1


for i in range(200):
    t = threading.Thread(target=run, args=(i,))
    t.start()
    p_list.append(t)

for p in p_list:
    p.join()

print num

执行结果:

image

啊结果怎么是194 啊,不是200吗,着是原因是在线程操作公共数据时候没有添加锁,导致所有拿取公共数据的时候没有规范

加锁代码

#!/usr/bin/python
# coding:utf8
import threading
import time

p_list = []
num = 0 
def run(n):
    print 'this is %s num' % n
    global num 
    time.sleep(1)
    lock.acquire()
    num += 1
    lock.release()


lock = threading.Lock()
for i in range(200):
    t = threading.Thread(target=run, args=(i,))
    t.start()
    p_list.append(t)

for p in p_list:
    p.join()

print num

在看执行结果:

image  无论你执行多少次都没有问题

posted @ 2016-05-27 11:16  zhaogaolong  阅读(288)  评论(0)    收藏  举报