python使用笔记26--多线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python使用笔记26--多线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3320字,纯文字阅读大概需要5分钟。
内容图文
1、多线程概念
线程、进程
进程是资源的集合,也就是一个程序
线程是一个程序运行的最小单位
线程是在进程里面的
默认,一个进程就只有一个线程
2、多线程代码
串行的方式是执行完一个,再接着执行第二个
多线程是同时启用多个线程去操作
1 def insert_db(): 2 time.sleep(3) 3print(‘insert_db over‘) 4 5 start_time = time.time() 6for i in range(3): #串行的方式 7 insert_db() 8 end_time = time.time() 9print(‘串行的执行的时间‘,end_time - start_time ) 1011 start_time2 = time.time() 12#2、判断当前存活的线程个数为1个时13for i in range(3): 14 t = threading.Thread(target=insert_db) 15 t.start() 1617while threading.activeCount()!=1: 18pass1920 end_time2 = time.time() 21print(‘多线程执行的时间‘,end_time2 - start_time2)#只是主线程执行的时间,不计算子线程执行的时间
执行结果如图所示:
3、多线程的时间统计
1 def insert_db(): 2 time.sleep(3) 3print(‘insert_db over‘) 4 start_time2 = time.time() 5#2、判断当前存活的线程个数为1个时 6for i in range(3): 7 t = threading.Thread(target=insert_db) 8 t.start() 910 end_time2 = time.time() 11print(‘多线程执行的时间‘,end_time2 - start_time2)#只是主线程执行的时间,不计算子线程执行的时间
执行结果如图所示:
正常执行应该是3秒多一点,这里是因为只是主线程执行的时间,没有计算子线程执行的时间,如何解决该问题?
1.用两次循环来解决,这样代码看起来比较繁琐
1 threads = [] 2 start_time2 = time.time() 3#2、判断当前存活的线程个数为1个时 4for i in range(3): 5 t = threading.Thread(target=insert_db) 6 t.start() 7 threads.append(t) 8 9for i in threads: 10 i.join() 11 end_time2 = time.time() 12print(‘多线程执行的时间‘,end_time2 - start_time2)
2.用while循环来解决,判断当前活动的线程数为1,统计时间,如果不为1,则进入循环,不统计时间
1 start_time2 = time.time() 2#2、判断当前存活的线程个数为1个时 3for i in range(3): 4 t = threading.Thread(target=insert_db) 5 t.start() 6 7while threading.activeCount()!=1: 8pass 910 end_time2 = time.time() 11print(‘多线程执行的时间‘,end_time2 - start_time2)
4、多线程传参
用元组的方式传参,args=(i,)#这里传入的是一个元组,一个参数时要加,
也可以用数组的方式来传参,args=[‘lxy‘]
1 import threading 2 import requests 3 import hashlib 4 import time 5 def down_load(url): 6 name = hashlib.md5(url.encode()).hexdigest() 7 r = requests.get(url) 8 with open(‘%s.jpg‘%name,‘wb‘) as fw: 9 fw.write(r.content) 1011 l = [ 12‘http://www.nnzhp.cn/wp-content/themes/QQ/images/logo.jpg‘, 13‘http://www.nnzhp.cn/wp-content/uploads/2016/12/2016aj5kn45fjk5-150x150.jpg‘, 14‘http://www.nnzhp.cn/wp-content/themes/QQ/images/thumbnail.png‘15] 1617for i in l: 18 t = threading.Thread(target=down_load,args=(i,))#args=(i,),一个参数的时候要加,19 t.start() 2021while threading.activeCount() != 1: 22pass2324print(‘down_load over...‘)
5、多线程获取函数返回值
多线程运行函数时,是没有办法获取到函数的返回值,所以可以定义一个全局的list,把函数的返回结果存到list就可以了
1 case_result = [] 2def run_case(case_name): 3print(‘run case over...‘) 4 case_result.append({case_name,‘success‘})
6、守护线程
守护线程,一旦主线程死掉,不管守护线程有没有执行完成,守护线程全部都结束
1 # 守护线程,一旦主线程死掉,不管守护线程有没有执行完成,全部都结束 2 3 import threading 4 import time 5 6 def talk(name): 7 print(‘正在和%s聊天‘%name) 8 time.sleep(200) 91011def shipin(name): 12print(‘正在和%s视频‘ % name) 13 time.sleep(200) 141516print(‘qq聊天窗口‘) 17 t1 = threading.Thread(target=talk,args=[‘xxl‘]) 18 t1.setDaemon(True)#设置线程为守护线程19t1.start() 202122 t2 = threading.Thread(target=shipin,args=[‘lxy‘]) 23 t2.setDaemon(True)#设置线程为守护线程24t2.start() 252627 time.sleep(5) 28print(‘结束‘)
7、线程锁
多个线程同时操作同一个数据时,会有问题,这个时候需要用到线程锁
线程锁需要设置锁定时长,数据操作完成后,需要解锁,不然其他线程会进入无线等待
1 # 线程锁 2 # 多个线程同时操作同一个数据的时候,会有问题 3 import threading 4 lock = threading.Lock() 5 count = 0 6def test(): 7global count 8 lock.acquire(timeout=3000)#加锁,设置超时时间为3毫秒 9 count += 1 10print(count) 11 lock.release()#解锁1213for i in range(100): 14 t = threading.Thread(target=test) 15 t.start()
原文:https://www.cnblogs.com/cjxxl1213/p/13121790.html
内容总结
以上是互联网集市为您收集整理的python使用笔记26--多线程全部内容,希望文章能够帮你解决python使用笔记26--多线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。