介绍

1、多线程

其实python在同一时间只允许一个线程执行一个任务,其它线程都会被锁住。多线程其实就是不停的线程切换,给人以多线程的现象。python中实现这个功能的结构称为全局解释器锁(GIL)。

如果任务都是相同的,比如一直执行total=total+1,这时其实多线程帮不了太多忙,即使单线程也可以完成这个工作,因为单线程在处理这个操作的时候,基本上没有阻碍和停滞。不像上次举的汽车装配的例子,当其中一个工位被占用的时候,这时多线程可以执行另外两个操作,从而加快整体的速度。

如果遇到这种情况,可以考虑多核操作。每个核有单独的逻辑空间,不同核内可以在相同时间同时运行一个线程。

2、多进程

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就不必我多讲了吧,所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。

在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。

在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。 多任务带来的好处是明显的,比如你可以边听mp3边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。那么这里就涉及到并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。

如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。但如果进程数大于CPU数,则仍然需要使用并发技术。

Python中多线程之lock()

这是锁的概念,首先直观的看下没有锁的状态:

import threadingdef job1():global Afor i in range(10):A+=4print('job1',A)def job2():global Afor i in range(10):A+=10print('job2',A)if __name__=='__main__':A=0t1=threading.Thread(target=job1)t2 = threading.Thread(target=job2)t1.start()t2.start()t1.join()t2.join()

输出结果:

job1 4
job1 8
job1 12
job1 16
job1 20
job1 24
job2 34
job1 38
job2 48
job1 52
job2 62
job1 66
job2 76
job1 80
job2 90
job2 100
job2 110
job2 120
job2 130
job2 140

从结果上可以看出,输出的比较乱,这是因为在t1没有计算完成时,t2也开始了计算,这就导致输出比较乱,有交叉和重叠。

加上锁之后:

import threadingdef job1():global A,locklock.acquire()for i in range(10):A+=4print('job1',A)lock.release()def job2():global A,locklock.acquire()for i in range(10):A+=10print('job2',A)lock.release()if __name__=='__main__':lock=threading.Lock()A=0t1=threading.Thread(target=job1)t2 = threading.Thread(target=job2)t1.start()t2.start()t1.join()t2.join()

输出结果:

job1 4
job1 8
job1 12
job1 16
job1 20
job1 24
job1 28
job1 32
job1 36
job1 40
job2 50
job2 60
job2 70
job2 80
job2 90
job2 100
job2 110
job2 120
job2 130
job2 140

可以看出job1和job2之间互不干涉,这是因为lock可以锁住线程,基本思想就是,在执行完job1之前,该线程不会去执行其它操作,只会执行job1,当job1完成后开始解锁,这个时候线程才会去执行job2,最终输出的是有序的数据。

死锁和递归锁RLock

死锁:是指俩个或者俩个以上的进程或线程在执行过程中,因争夺资源而找出的一种互相等待的现象,若无外力作用,他们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

from threading import Thread,RLock,Lock
import time
# mutexA=Lock()
# mutexB=Lock()
mutexA=mutexB=RLock()  #RLock锁可以解决死锁问题,只要锁的引用计数为0,大家就都可以抢了
class MyThread(Thread):def run(self):self.f1()self.f2()def f1(self):mutexA.acquire() #1print('%s 拿到了A锁' %self.name)mutexB.acquire() #2print('%s 拿到了B锁' %self.name)mutexB.release() # 1mutexA.release() # 0#此时引用计数都是0了,第一个线程也会跟着其他的线程一起去抢才能抢到锁def f2(self):mutexB.acquire()print('%s 拿到了B锁' %self.name)time.sleep(0.1)mutexA.acquire()print('%s 拿到了A锁' %self.name)mutexA.release()mutexB.release()if __name__=='__main__':for i in range(10):t=MyThread()t.start()

线程池ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor
from threading import current_thread
import requests
import timedef get(url):print('%s get %s' %(current_thread().getName(),url))response=requests.get(url)time.sleep(2)if response.status_code==200:return {'url':url,'content':response.text}def parse(res):res=res.result()print('parse:[%s] res:[%s]' %(res['url'],len(res['content'])))if __name__ == '__main__':pool=ThreadPoolExecutor(2)urls=['https://www.baidu.com','https://www.python.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org','https://www.openstack.org',]for url in urls:pool.submit(get,url).add_done_callback(parse)pool.shutdown(wait=True)

更多内容请参考:https://blog.csdn.net/qq_34857250/article/details/79314201#多进程

python使用多线程(二)相关推荐

  1. python房地产爬虫_房产中介网站爬虫实战(Python BS4+多线程)(一)

    本系列文章介绍了爬取链家和搜房网(房天下)数据的方法. 房产中介网站爬虫实战(Python BS4+多线程)(一) 房产中介网站爬虫实战(Python BS4+多线程)(二) 房地产市场向来是大数据分 ...

  2. python学习笔记(二十三) -- 多进程和多线程

    目录 多线程多进程的意义 多进程的使用 方式一(fork):  只能在Unix/Linux/Mac系统下执行,windows不可以 方式二(multiprocessing.Process): 全平台通 ...

  3. Python第十二章-多进程和多线程01-多进程

    多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...

  4. python多线程爬虫实例-Python实现多线程爬虫

    编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...

  5. python 知识点记录二

    2017/5/4 numpy.array可以直接计算var mean sum等值 2017/5/8 print输出%符号 需要%% prin('%d%%'%d) 2017/5/15 anacoda在a ...

  6. Python面试常用二十题总结

    1.请至少用一种方法下面字符串的反转? 1).A[::-1] 2).交换前后字母的位置 t = list(A) l = len(t) for i, j inzip(range(l - 1, 0, -1 ...

  7. python的多线程threading_Python中多线程thread与threading的实现方法,pythonthreading

    Python中多线程thread与threading的实现方法,pythonthreading 学过Python的人应该都知道,Python是支持多线程的,并且是native的线程.本文主要是通过th ...

  8. python优先队列的库,python优先队列及二叉堆的实现

    python优先队列及二叉堆的实现 发布于 2015-12-18 06:55:17 | 117 次阅读 | 评论: 0 | 来源: PHPERZ Python编程语言Python 是一种面向对象.解释 ...

  9. python的多线程适合计算密集操作_Python 多线程操作学习

    Python 多线程操作 什么是线程: 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一点儿在运行 ...

  10. Python中多线程thread与threading的实现方法

    Python中多线程thread与threading的实现方法 这篇文章主要介绍了Python中多线程thread与threading的实现方法,很重要的应用,需要的朋友可以参考下 学过Python的 ...

最新文章

  1. 酸奶饮料新产品口味测试研究案例
  2. Hadoop控制输出文件命名
  3. 在ASP.NET中重写URL 方法三:在IIS7中使用HttpModule 实现无扩展名的URL重写
  4. legend2---开发常用语句
  5. Linux netstat命令介绍
  6. 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例)
  7. 站在巨人肩上的.NET Core 2.1
  8. LeetCode 216. 组合总和 III(排列组合 回溯)
  9. python打开chrome浏览器登录用户名密码_[工具]Python获取Chrome浏览器已保存的所有账号密码...
  10. ADB命令和Monkey命令
  11. 【SENCHA TOUCH】datepickerfield将日期改为中文日期或自定义的日期
  12. 诺顿企业版 V11.0
  13. 账结法”、“表结法”两种财务会计处理方法
  14. 被“自由行动祝福”环绕的战士 —— 微软实习之魔兽攻略版
  15. 云服务器有token_配置node服务器并且链接微信公众号接口配置
  16. 特斯拉第二季度交付9.52万辆电动汽车创纪录 股价盘后上涨7%
  17. john 探测(爆破)弱口令(包含linux机器,aix小机)/linux上的shadow文件破解,亲测可用
  18. 获取验证码按钮 点击后开始倒计时
  19. Nginx与LUA(2)
  20. 中考计算机操作题试题文档,初中信息技术中考excel操作题

热门文章

  1. phpexcel 打开时 excel无法识别此文件格式
  2. UICollectionView实现带头视图和组的头视图同时存在实现
  3. mysql-查询一天,一周,一月,一年,以及mysql的基本日期函数
  4. SharePoint2010企业开发最佳实践(八)---- SPWeb 对象
  5. AS3 CookBook学习整理(二)
  6. Nginx系列——Windows中安装Nginx
  7. 如何解决chm类型的文件在Windows操作系统中无法打开
  8. GDAL建立GeoTIFF金字塔文件
  9. QA:阿里云K8s启动容器后无法访问网络
  10. windows netcat的安装与使用