一、线程的几个常用的函数
1.生成一个新线程
start_new_thread(function, args, kwargs = None)
2.分配LockType锁对象
allocate_lock()
3.线程推出指令
exit()
LockType对象的方法
1.获取锁对象
acquire()
2. 如果获取了锁对象返回True 否则False
locked()
3.释放所
release()
二、结合实例来看一下_thread 和 上述函数的用法
1.首先看一下为什么要引入多线程,首先看一段代码
date_time_format = "%y-%M-%d %H:%M:%S"
def date_time_str(date_time):
return datetime.strftime(date_time, date_time_format)
def loop0():
print('start loop0 at:', date_time_str(datetime.now()))
sleep(4)
print('loop0 done at:', date_time_str(datetime.now()))
def loop1():
print('start loop1 at:', date_time_str(datetime.now()))
sleep(2)
print('loop1 done at:', date_time_str(datetime.now()))
def main():
print('starting at:', date_time_str(datetime.now()))
loop0()
loop1()
print('all DONE at:', date_time_str(datetime.now()))
if __name__ == '__main__':
main()
打印结果如下:
Screen Shot 2018-04-09 at 00.05.23.png
执行以上代码至少需要6秒时间,先执行完loop0()然后再执行loop1()。如果loop0() 和 loop1()是两个独立计算操作的函数,让他们并行执行减少总的时间,这就是为什么我们要使用多线程。
2.使用多线程技术,代码如下:
date_time_format = "%y-%M-%d %H:%M:%S"
def date_time_str(date_time):
return datetime.strftime(date_time, date_time_format)
def loop0():
print('start loop0 at:', date_time_str(datetime.now()))
sleep(4)
print('loop0 done at:', date_time_str(datetime.now()))
def loop1():
print('start loop1 at:', date_time_str(datetime.now()))
sleep(2)
print('loop1 done at:', date_time_str(datetime.now()))
def main():
print('starting at:', date_time_str(datetime.now()))
_thread.start_new_thread(loop0, ())
_thread.start_new_thread(loop1, ())
sleep(6)
print('all DONE at:', date_time_str(datetime.now()))
if __name__ == '__main__':
main()
执行结果如下:
Screen Shot 2018-04-09 at 00.07.43.png
从结果可以看出loop0() 和 loop1()是同时开始执行的,且loop1()先于loop0()执行完。
为什么增加一个sleep(6)? sleep(6)在这里作为同步机制来阻止主线程继续执行,如果没有该语句,主线程会直接执行完毕,然后退出,这将导致loop0() 和 loop1()两个线程直接终止。
3.引入更好的同步机制 ‘锁’ 代码如下
date_time_format = "%y-%M-%d %H:%M:%S"
def date_time_str(date_time):
return datetime.strftime(date_time, date_time_format)
loops = [2, 4]
def loop(nloop, nsec, lock):
print('start loop', nloop, 'at:',date_time_str(datetime.now()))
sleep(nsec)
print('loop', nloop, 'done at:', date_time_str(datetime.now()))
lock.release()
def main():
print('Starting ar:',date_time_str(datetime.now()))
locks = []
nloops = range(len(loops))
for i in nloops:
lock = _thread.allocate_lock()
lock.acquire()
locks.append(lock)
for i in nloops:
_thread.start_new_thread(loop, (i, loops[i], locks[I]))
for i in nloops:
while locks[i].locked():
pass
print('all NONE AT:', date_time_str(datetime.now()))
if __name__ == '__main__':
main()
执行结果如下:
Screen Shot 2018-04-09 at 00.17.17.png
从结果可以看出,整个过程只用了4秒的时间,这就实现了我们使用多线程技术编程的目的。
三、注意事项
在实例2中:
_thread.start_new_thread(loop0, ())
_thread.start_new_thread(loop1, ())
第一个参数传入的是函数名 不能加括号,否则会报【TypeError: first arg must be callable】错误。这种错的原因一般是由于函数作为参数时,多了括号()造成的,加括号表示有返回值,不加括号没有返回值。
下节python 多线程高级模块Threading
未完待续~🙈
网友评论