本文实例讲述了Python多线程原理与用法。分享给大家供大家参考,具体如下:
先来看个栗子:
下面来看一下I/O秘籍型的线程,举个栗子——爬虫,下面是爬下来的图片用4个线程去写文件
#!/usr/bin/env python # -*- coding:utf-8 -*- import re import urllib import threading import Queue import timeit def getHtml(url): html_page = urllib.urlopen(url).read() return html_page # 提取网页中图片的URL def getUrl(html): pattern = r'src="/UploadFiles/2021-04-08/img.*">4个线程的执行耗时为:0.421320716723秒
修改一下main_1换成单线程的:
def main_1(): global count threads = [] count = 0 queue = Queue.Queue() # 将所有任务加入队列 for img in imglist: queue.put(img) # 多线程爬去图片 for i in range(1): thread = getImg(queue, i) threads.append(thread) # 阻塞线程,直到线程执行完成 for thread in threads: thread.join()单线程的执行耗时为:1.35626623274秒
再来看一个:
#!/usr/bin/env python # -*- coding:utf-8 -*- import threading import timeit def countdown(n): while n > 0: n -= 1 def task1(): COUNT = 100000000 thread1 = threading.Thread(target=countdown, args=(COUNT,)) thread1.start() thread1.join() def task2(): COUNT = 100000000 thread1 = threading.Thread(target=countdown, args=(COUNT // 2,)) thread2 = threading.Thread(target=countdown, args=(COUNT // 2,)) thread1.start() thread2.start() thread1.join() thread2.join() if __name__ == '__main__': t1 = timeit.Timer(task1) print "countdown in one thread ", t1.timeit(1) t2 = timeit.Timer(task2) print "countdown in two thread ", t2.timeit(1)task1是单线程,task2是双线程,在我的4核的机器上的执行结果:
countdown in one thread 3.59939150155
countdown in two thread 9.87704289712
天呐,双线程比单线程计算慢了2倍多,这是为什么呢,因为countdown是CPU密集型任务(计算嘛)
I/O密集型任务:线程做I/O处理的时候会释放GIL,其他线程获得GIL,当该线程再做I/O操作时,又会释放GIL,如此往复;
CPU密集型任务:在多核多线程比单核多线程更差,原因是单核多线程,每次释放GIL,唤醒的哪个线程都能获取到GIL锁,所以能够无缝执行(单核多线程的本质就是顺序执行),但多核,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0(CPU0上可能不止一个线程)拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 廖也欧《面朝大海》[Hi-Res][24bit 48kHz][FLAC/分轨][170.14MB]
- s13T1夺冠五人名单都有谁 s13T1夺冠五人名单一览
- 英雄联盟T1战队队长都有谁 T1战队所有队长介绍
- skt历届战队成员都有哪些 skt历届战队成员名单盘点
- 妙音唱片《大热唱片3》[WAV+CUE]
- 费玉清《跟着地球旋转》滚石时代经典复刻[正版原抓WAV+CUE]
- 罗文甄妮-射雕英雄传(AMCD)(限量版)[WAV+CUE]
- 《巫师4》定档2025再添佐证:参演人员曝光 老将回归
- 辣眼睛 美女COS《黑神话:悟空》比基尼版金池长老
- 外媒称PS5pro违背承诺:《蜘蛛侠2》根本没法4K60帧
- 令晴 Lynn《The Make》[320K/MP3][44.47MB]
- 令晴 Lynn《The Make》[Hi-Res][24bit 48kHz][FLAC/分轨][295.42MB]
- 雷婷《移情别恋HQⅡ》头版限量编号[低速原抓WAV+CUE][1G]
- FUNDAMENTAL.1989-感觉号渡轮【SONY】【WAV+CUE】
- 上山安娜.1986-上山安娜【EMI百代】【WAV+CUE】