今天我们来介绍多线程。
进程里有很多目标,多线程的目的简言之就是加快进程,提高效率,多个操作同时进行。
下面来看代码:
一.初识

import time
import threading###############单线程##############################def coding():for x in range(3):print("正在玩孙尚香%s"%x)time.sleep(1)def codis():for x in range(3):print("正在玩孙权%s" %x)time.sleep(1)def main():coding()codis()if __name__ == '__main__':main()
######3##############多线程###########################
def coding():for x in range(3):print("正在玩孙尚香%s" % threading.current_thread())#打印当前线程的名字time.sleep(1)
def codis():for x in range(3):print("正在玩孙权%s" %  threading.current_thread())#打印当前线程的名字time.sleep(1)def main():t1=threading.Thread(target=coding)#创建线程t2=threading.Thread(target=codis)#创建线程t1.start()t2.start()print(threading.enumerate())#打印所有线程的名字
if __name__ == '__main__':main()

#二.使用thread类创建多线程

#二.使用thread类创建多线程class CodingThread(threading.Thread):
#     def run(self):
#         for x in range(3):
#             print("正在玩孙尚香%s" % threading.current_thread())  # 打印当前线程的名字time.sleep(1)class DrawThread(threading.Thread):def run(self):for x in range(3):print("正在玩孙权%s" % threading.current_thread())time.sleep(1)def main():t1=CodingThread()t2=DrawThread()t1.start()t2.start()if __name__ == '__main__':main()

三.多线程共享全局变量及锁机制

VALUE=0
gLook=threading.Lock()#锁机制1
def add_value():global VALUEgLook.acquire()#锁机制2for x in range(10000000):VALUE+=1gLook.release()#锁机制3print(VALUE)
def main():for x in range(2):t1=threading.Thread(target=add_value)t1.start()
if __name__ == '__main__':main()

四.多线程实例(生产者与消费者模式)
lock版本

import time
import threading
import random
gMoney=1000
gLock=threading.Lock()
gtotalTimes=10
gTime=0
class Producer(threading.Thread):def run(self):global gMoneyglobal gTimewhile True:money=random.randint(100,1000)gLock.acquire()if gTime>=gtotalTimes:gLock.release()breakgMoney+=moneyprint('%s生产了%d元,剩余%d元钱'%(threading.current_thread(),money,gMoney))gTime+=1gLock.release()time.sleep(0.5)class Consumer(threading.Thread):def run(self):global gMoneywhile True:money=random.randint(100,1000)gLock.acquire()if gMoney>=money:gMoney-=moneyprint("%s消费了%d元,剩余%d元"%(threading.current_thread(),money,gMoney))else:if gTime>=gtotalTimes:gLock.release()breakprint('%s消费者准备消费%d元,剩余%d元,不足!'%(threading.current_thread(),money,gMoney))gLock.release()time.sleep(0.5)
def main():for x in range(3):t=Consumer(name='消费者线程%d'%x)t.start()for x in range(5):t=Producer(name='生产者线程%d'%x)t.start()if __name__ == '__main__':main()

五.condition版本的消费者和生产者模式。
为了克服lock版本对cpu的损耗,我们采用threading.condition

1.acquire上锁
2.release解锁
3.wait:将该线程处于等待状态,并且会释放锁,可以被notify,notify_all唤醒。
4.notify通知某个在等待进程,默认为第一个。
5.notify_all:通知所有在等待的进程,并且notify_all和notify不会解锁,应该啊在release前调用。
下面来看代码:

import time
import threading
import random
gMoney=1000
gCondition=threading.Condition()
gtotalTimes=10
gTime=0
class Producer(threading.Thread):def run(self):global gMoneyglobal gTimewhile True:money=random.randint(100,1000)gCondition.acquire()if gTime>=gtotalTimes:gCondition.release()breakgMoney+=moneyprint('%s生产了%d元,剩余%d元钱'%(threading.current_thread(),money,gMoney))gTime+=1gCondition.notify_all()#通知苏醒gCondition.release()time.sleep(0.5)class Consumer(threading.Thread):def run(self):global gMoneywhile True:money=random.randint(100,1000)gCondition.acquire()while gMoney<money:if gTime>=gtotalTimes:returnprint("%s准备消费%d元,剩余%d元,不足!"%(threading.current_thread(),money,gMoney))gCondition.wait()print('%s消费了%d元,剩余%d元'%(threading.current_thread(),money,gMoney))gCondition.release()time.sleep(0.5)
def main():for x in range(3):t=Consumer(name='消费者线程%d'%x)t.start()for x in range(5):t=Producer(name='生产者线程%d'%x)t.start()if __name__ == '__main__':main()

Queue线程安全队列
加锁是个经常的过程,如果你想把一些数据存储到某个队列,python内置queue模块,其中Queue(先进先出),LiFoQueue(后进先出),可在多线程中使用,实现线程的同步。
1.q=Queue(3)#初始化创建一个先进先出队列。
2.qsize(),返回队列的大小。
3.empty()判断是否为空。
4.full() 判断是否满。
5.get() 按队列规则取出数据。
6.put(),将数据放入队列中。
下面看代码:

from queue import Queue
import time
import threading
q=Queue(4)
# print(q.qsize())
# print(q.empty())
# for x in range(4):
#     q.put(x)
#     print()
# print(q.full())
# for x in range(4):
#     print(q.get())
def set_value(q):index=0while True:q.put(index)index+=1time.sleep(3)
def get_valuee(q):while True:print(q.get())
def main():q=Queue(4)t1=threading.Thread(target=set_value,args=[q])t2=threading.Thread(target=get_valuee,args=[q])t1.start()t2.start()
if __name__ == '__main__':main()

[python爬虫之路day13]:多线程——加速爬取数据相关推荐

  1. python爬虫,请教一下为何我爬取数据有的完整有的不完整 爬的百家号 登陆这一块还没解决 但关注这一块很难解决

    下面附上我的代码.求教一下. 我该考虑的东西都考虑 是加载的时候认为我是爬虫么? from selenium import webdriver import time from pyquery imp ...

  2. 基于python爬虫————静态页面和动态页面爬取

    基于python爬虫----静态页面和动态页面爬取 文章目录 基于python爬虫----静态页面和动态页面爬取 1. 爬虫的原理 2. 用正则表达式匹配获取数据 3. 页面源码解析 4. 通过req ...

  3. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

  4. Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影

    文章目录 前言 安装bs4库 网站分析 获取页面 爬取页面 页面分析 其他页面 爬虫系列 前言 经过上篇博客Python爬虫小白教程(一)-- 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在 ...

  5. python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...

    Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...

  6. Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息

    Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息 基础: Python 爬虫 之 Selenium.webdriver 的安装,以及模拟打开操作 ...

  7. Python爬虫学习基础——5分钟学会爬取B站视频日播放量排行

    Python爬虫学习基础--5分钟学会爬取B站视频日播放量排行 基础包含 requests pyquery 进入正题 基础包含 这也是我当初第一次学习爬虫时做的练习,感觉给初学者练笔挺不错的.运用的知 ...

  8. Python爬虫系列(二):爬取中国大学排名丁香园-用户名和回复内容淘宝品比价

    Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品比价 目录 Python爬虫系列(二):爬取中国大学排名&丁香园-用户名和回复内容&淘宝品 ...

  9. python 扒数据_不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得 ...

  10. Python爬虫:用最普通的方法爬取ts文件并合成为mp4格式

    介绍: 在自学爬虫时,一开始就是爬取一些文字(比如小说之类的),再后来变成了图片,再后来变成了视频- 其中最简单的就是对文字的爬取了,从文字过渡到图片也只是多了几行代码而已,但是: 从图片过渡到视频就 ...

最新文章

  1. 【Paper】2020_含时延约束的多智能体系统二分一致性
  2. c++快速排序(附完整源码)
  3. html自动轮播计时器不准,用jQuery写的图片轮播为何停止定时器只能停止一次?...
  4. zzulioj1111: 多个整数的逆序输出(函数专题)
  5. AI工程师的崩溃,是从你的薪资比我高开始
  6. 编程 态度目标_对目标持开放态度,从而推动事业发展
  7. redhat6.9系统telnet命令rpm包安装
  8. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例...
  9. PHP中的Array类型其实是Hashtable
  10. 细说业务逻辑(前篇)
  11. VUE+Django项目编写
  12. 最轻松mflac转flac、mp3方法
  13. 三角形和矩形傅里叶变换_第3章傅立叶变换.doc
  14. 为什么大人学英语这么难?
  15. 微信小程序:独家全新娱乐性超高的喝酒神器
  16. 坐标沿着原点旋转/坐标轴旋转变换公式
  17. 如何编写udf函数(收藏篇)
  18. ue4html插件,【UE4插件Mirror】全球超千万Maya用户终于可以高质量实时渲染了
  19. Scilab的初步介绍
  20. WebIM 即时通信

热门文章

  1. 【vue-cli3源码解析】02_vue create命令
  2. Android Framework 框架系列之 Crash 工具
  3. [VB.NET]急死!2005中如何更新数据源,老鸟帮帮手,立马揭帖
  4. 气象要素数据提取程序
  5. 美味多汁的山东奶油富士,还带着淡淡奶香
  6. 一小只支付接口的自动化
  7. C语言实现加法运算,计算进位次数
  8. JavaWeb学习——springBoot基础(无图,待补)
  9. python读取word/pdf文档,逐页读取-指定文字内容和图片
  10. 什么是链游?链游又有哪些风险?