关于Python的进程线程协程之threading模块(二)Lock,RLock对象以及Semaphore,BoundedSemaphore对象
线程锁:由于线程之间是随机调度的,并且每个线程在cpu上只执行指定数量的字节码(100),所以当多个线程同时修改同一条数据时可能会出现脏数据,为了规避这一情况,线程锁应运而生,同一时刻允许一个线程执行操作。
实例一:
无锁情况,在cpu性能不佳的时候容易产生脏数据
# _*_coding:utf-8_*_
import threading
from time import sleep, ctime
maxlink = 10
# A pool of thread maxlink
thread_pool = []
# A pool of thread that save instantiation threads 存放线程实例的线程池
count = 0
# A global var
def loop(index):
"""A function for sleep sometime s """
print "start loop %s at: " % index, ctime()
global count
count += 1
sleep(2)
print "end loop %s at: " % index, ctime()
def Thread_Pool(*arg):
"""A function that create and save instantiation
of threading to thread pool"""
func, LN = arg
for i in range(LN):
t = threading.Thread(target=func, args=(i,))
thread_pool.append(t)
def Thread_Start(arg):
"""A function that represents a thread of control."""
for i in range(arg):
thread_pool[i].start()
for i in range(arg):
thread_pool[i].join()
def main():
"""A function of main"""
print "process start at: ".upper(), ctime()
Thread_Pool(loop, maxlink)
Thread_Start(maxlink)
print "process end at: ".upper(), ctime(), "now count :", count
if __name__ == '__main__':
main()
运行结果:
PROCESS START AT: Fri Apr 28 16:49:28 2017
start loop 0 at: Fri Apr 28 16:49:28 2017
start loop 1 at: Fri Apr 28 16:49:28 2017
start loop 2 at: Fri Apr 28 16:49:28 2017
start loop 3 at: Fri Apr 28 16:49:28 2017
start loop 4 at: Fri Apr 28 16:49:28 2017
start loop 5 at: Fri Apr 28 16:49:28 2017
start loop 6 at: Fri Apr 28 16:49:28 2017
start loop 7 at: Fri Apr 28 16:49:28 2017
start loop 8 at: Fri Apr 28 16:49:28 2017
start loop 9 at: Fri Apr 28 16:49:28 2017
end loop 0 at: end loop 2 at: end loop 1 at: Fri Apr 28 16:49:30 2017Fri Apr 28 16:49:30 2017Fri Apr 28 16:49:30 2017