有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到。而且之前讲过的GIL也是对python多线程的一种限制。那么,我们为什么还要用多线程呢?当然是多线程的优势已经掩盖了它本身不足之处,所以我们来加强一下学习python多线程的信心吧~

总结起来,使用多线程编程具有如下几个优点:

进程之间不能共享内存,但线程之间共享内存非常容易。

操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此,使用多线程来实现多任务并发执行比使用多进程的效率高。

Python 语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了 Python 的多线程编程。

threading模块

普通创建方式

import threading

import time

def run(n):

print("task", n)

time.sleep(1)

print('2s')

time.sleep(1)

print('1s')

time.sleep(1)

print('0s')

time.sleep(1)

if __name__ == '__main__':

t1 = threading.Thread(target=run, args=("t1",))

t2 = threading.Thread(target=run, args=("t2",))

t1.start()

t2.start()

----------------------------------

>>> task t1

>>> task t2

>>> 2s

>>> 2s

>>> 1s

>>> 1s

>>> 0s

>>> 0s

守护线程

我们看下面这个例子,这里使用setDaemon(True)把所有的子线程都变成了主线程的守护线程,因此当主进程结束后,子线程也会随之结束。所以当主线程结束后,整个程序就退出了。

import threading

import time

def run(n):

print("task", n)

time.sleep(1) #此时子线程停1s

print('3')

time.sleep(1)

print('2')

time.sleep(1)

print('1')

if __name__ == '__main__':

t = threading.Thread(target=run, args=("t1",))

t.setDaemon(True) #把子进程设置为守护线程,必须在start()之前设置

t.start()

print("end")

----------------------------------

>>> task t1

>>> end

我们可以发现,设置守护线程之后,当主线程结束时,子线程也将立即结束,不再执行。

python多线程实例代码:

1个线程时:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/3.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/4.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/6.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/8.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

Done, Time cost: 8.182249069213867

2个线程时:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/4.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/8.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

Done, Time cost: 4.0987958908081055

python3线程池爬虫_python3爬虫中多线程的优势总结相关推荐

  1. python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例

    生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开.同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令.但是鉴于我们实际运 ...

  2. python3 爬虫_Python3爬虫介绍

    Python3爬虫介绍 一.为什么要做爬虫 首先请问:都说现在是"大数据时代",那数据从何而来? 数据管理咨询公司:麦肯锡.埃森哲.艾瑞咨询 爬取网络数据:如果需要的数据市场上没有 ...

  3. [Python3] 线程池的使用

    认知: 对于多线程的作用,简单点就是把一项重复的任务分给多个渠道一起完成,这样就大大提高工作效率. 目前大多数使用线程用的都是threading模块,这模块对于现在来说我认为已经落后了,就拿爬虫来说, ...

  4. python线程池并发_python 并发编程多线程之进程池/线程池

    一.验证GIL锁的存在 Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可以"运行"多个线程,但在任意时刻只有一个线程在解释器中运行 ...

  5. python3 线程池 ThreadPoolExecutor 简介

    前言 从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进 ...

  6. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

    概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...

  7. 环形队列出队的元素怎么输出出来_队列:队列在线程池等有限资源池中的应用...

    我们知道,CPU资源是有限的,任务的处理速度与线程个数并不是线性正相关的.相反,过多的线程反而会导致CPU频繁切换,处理性能下降.所以,线程池的大小一般都是综合考虑要处理任务的特点和硬件环境,来事先设 ...

  8. 线程池和任务工厂实现多线程异步运行

    将多个线程在线程池中运行 知识点保温 引用一下微软官网的介绍: 线程池: https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.th ...

  9. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...

最新文章

  1. 判断输入的数是否质数,求范围内的质数有哪些
  2. 验证二叉搜索数—leetcode98
  3. hp-ux修改时区方法_UX研究人员可以倡导人类的6种方法
  4. 七牛云 转码_七牛云存储 - 七牛 php sdk 上传 转码 问题
  5. 新华社专题报道|陕建集团:打造「建筑行业」数字化转型标杆
  6. 【BZOJ2151】种树,贪心+Splay乱搞
  7. C++字符串操作总结
  8. 卷积神经网络-感受野的定义
  9. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q136-Q138)
  10. VC知识库文章 - NT DDK的安装以及设备驱动程序的编译
  11. 基于springBoot的薪资管理系统
  12. Unity3D游戏开发学习线路图附全套视频教程2019最新版
  13. 去哪儿CEO庄辰超:傍百度战携程与巨头共舞
  14. matlab 马氏距离 实例,MATLAB求马氏距离(Mahalanobis distance)
  15. Mel中级教程精华篇预告
  16. Mybatis中,SQLSessionFactoryBuilder使用build方法时做了哪些事?
  17. openlaw爬虫超级详细讲解
  18. 计算机 实验室安全准入制度,实验实训室安全准入制度(试行)
  19. 数字人民币跟第三方支付的区别
  20. Lammps 源代码解析

热门文章

  1. linux删除文件_Linux删除文件夹用什么命令
  2. 2 s锁是什么_《演员请就位》:一场戏拿了2张S卡,任敏凭什么打败老戏骨?
  3. php异步方案,php 伪异步执行实现方法
  4. 鸿蒙空间是什么星辰变,飞升之后做什么《星辰变》神魔妖界收伏奇珍异兽
  5. 鸿蒙系统桌面小艺建议怎么删除?鸿蒙系统小艺建议怎么设置关闭及开启
  6. java调试,调试模式不进入内部类解决
  7. 计算机系统存储器分类和总线分类
  8. mybatis常用jdbcType数据类型
  9. Mvvm、第一个Vue程序、Vue基本语法
  10. angularjs input标签用一个日期插件后数据不能双向绑定了_微信如何定时发朋友圈?(最方便最好用的办法!)...