线程和进程

1.进程是资源单位, 每一个进程至少要有一个线程
2.线程是执行单位
3.启动每一个程序默认都会有一个主线程

# 线程, 进程
# 进程是资源单位, 每一个进程至少要有一个线程
# 线程是执行单位# 启动每一个程序默认都会有一个主线程# def func():
#     for i in range(1000):
#         print("func", i)
#
#
# if __name__ == '__main__':
#     func()
#     for i in range(1000):
#         print("main", i)#  多线程, 创建一个线程类
from threading import Thread# def func():
#     for i in range(1000):
#         print("func", i)
#
#
# if __name__ == '__main__':
#     t = Thread(target=func)  # 创建线程并给线程安排任务
#     t.start()  # 多线程状态为可以开始工作状态, 具体的执行时间由CPU决定
#
#     for i in range(1000):
#         print("main", i)class MyThread(Thread):# 这个函数是固定的, 当线程被执行的时候, 被执行的就是run()def run(self):for i in range(1000):print("子线程", i)if __name__ == '__main__':t = MyThread()# t.run()  # 方法的调用了. -> 单线程# 开启线程t.start()for i in range(1000):print("主线程", i)

多进程的基础代码

# 多进程的代码基础
from multiprocessing import Process
from threading import Thread# def func():
#     for i in range(1000):
#         print("子进程", i)
#
#
# if __name__ == '__main__':
#     p = Process(target=func)
#     p.start()
#     for i in range(1000):
#         print("主进程", i)def func(name):for i in range(1000):print(name, i)if __name__ == '__main__':t1 = Thread(target=func, args=("周杰林",))t1.start()for i in range(1000):print(i)t2 = Thread(target=func, args=("王力宏",))t2.start()

线程池和进程池的基础

# 线程池和进程池的基础
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutordef fn(name):for i in range(1000):print(name, i)if __name__ == '__main__':# 创建线程池with ThreadPoolExecutor(50) as t:for i in range(100):t.submit(fn, name=f"线程{i}\n")# 等待线程池中的任务全部执行完毕。 才能继续执行(守护)print("123")

异步的导入

# import time
#
#
# def func():
#     print("我爱黎明")
#     time.sleep(3)  # 让当前的线程处于阻塞状态. CPU是不为我工作的
#     print("我真的爱黎明")
#
#
# if __name__ == '__main__':
#     func()
#
# """
# # input() 程序也是处于阻塞状态
# # requests.get(bilibili) 在网络请求返回数据之前, 程序也是处于阻塞状态的
# # 一般情况下, 当程序处于 IO操作的时候. 线程都会处于阻塞状态
#
# # 协程: 当程序遇见了IO操作的时候. 可以选择性的切换到其他任务上.
# # 在微观上是一个任务一个任务的进行切换. 切换条件一般就是IO操作
# # 在宏观上,我们能看到的其实是多个任务一起在执行
# # 多任务异步操作
#
# # 上方所讲的一切. 都是在单线程的条件下
# """# python编写协程的程序
# 导入异步操作的包
import asyncio
import time# async def func():
#     print("你好啊, 我叫赛利亚")
#
#
# if __name__ == '__main__':
#     g = func()  # 此时的函数是异步协程函数. 此时函数执行得到的是一个协程对象
#     # print(g)
#     asyncio.run(g)  # 协程程序运行需要asyncio模块的支持# async def func1():
#     print("你好啊, 我叫潘金莲")
#     # time.sleep(3)  # 当程序出现了同步操作的时候. 异步就中断了
#     await asyncio.sleep(3)  # 异步操作的代码
#     print("你好啊, 我叫潘金莲")
#
#
# async def func2():
#     print("你好啊, 我叫王建国")
#     # time.sleep(2)
#     await asyncio.sleep(2)
#     print("你好啊, 我叫王建国")
#
#
# async def func3():
#     print("你好啊, 我叫李雪琴")
#     await asyncio.sleep(4)
#     print("你好啊, 我叫李雪琴")
#
#
# if __name__ == '__main__':
#     f1 = func1()
#     f2 = func2()
#     f3 = func3()
#     tasks = [
#         f1, f2, f3
#     ]
#     t1 = time.time()
#     # 一次性启动多个任务(协程)
#     asyncio.run(asyncio.wait(tasks))
#     t2 = time.time()
#     print(t2 - t1)async def func1():print("你好啊, 我叫潘金莲")await asyncio.sleep(3)print("你好啊, 我叫潘金莲")async def func2():print("你好啊, 我叫王建国")await asyncio.sleep(2)print("你好啊, 我叫王建国")async def func3():print("你好啊, 我叫李雪琴")await asyncio.sleep(4)print("你好啊, 我叫李雪琴")async def main():# 第一种写法# f1 = func1()# await f1  # 一般await挂起操作放在协程对象前面# 第二种写法(推荐)tasks = [# py3.8以后加上asyncio.create_task()asyncio.create_task(func1()),asyncio.create_task(func2()),asyncio.create_task(func3())]await asyncio.wait(tasks)if __name__ == '__main__':t1 = time.time()# 一次性启动多个任务(协程)asyncio.run(main())t2 = time.time()print(t2 - t1)# # 在爬虫领域的应用
# async def download(url):
#     print("准备开始下载")
#     await asyncio.sleep(2)  # 网络请求  requests.get()
#     print("下载完成")
#
#
# async def main():
#     urls = [
#         "http://www.baidu.com",
#         "http://www.bilibili.com",
#         "http://www.163.com"
#     ]
#
#     # 准备异步协程对象列表
#     tasks = []
#     for url in urls:
#         d = asycio.create_task(download(url))
#         tasks.append(d)
#
#     # tasks = [asyncio.create_task(download(url)) for url in urls]  # 这么干也行哦~
#
#     # 一次性把所有任务都执行
#     await asyncio.wait(tasks)
#
# if __name__ == '__main__':
#     asyncio.run(main())

项目实战

# requests.get() 同步的代码 -> 异步操作aiohttp
# pip install aiohttpimport asyncio
import aiohttpurls = ["http://kr.shanghai-jiuxin.com/file/2020/1031/191468637cab2f0206f7d1d9b175ac81.jpg","http://kr.shanghai-jiuxin.com/file/2020/1031/563337d07af599a9ea64e620729f367e.jpg","http://kr.shanghai-jiuxin.com/file/2020/1031/774218be86d832f359637ab120eba52d.jpg"
]async def aiodownload(url):# 发送请求.# 得到图片内容# 保存到文件# rsplit()函数是第一个参数从右面开始进行切割,最后是一个列表的格式name = url.rsplit("/", 1)[1]async with aiohttp.ClientSession() as session:# resp = requests.get()# 可以自己去学习一个模块, aiofilesasync with session.get(url) as resp:# 创建文件with open(name, mode="wb") as f:# 读取内容是异步的. 需要await挂起, resp.text()f.write(await resp.content.read())print(name, "搞定")async def main():tasks = []for url in urls:tasks.append(aiodownload(url))await asyncio.wait(tasks)if __name__ == '__main__':# asyncio.run(main())# 会有如下的问题# raise RuntimeError('Event loop is closed')# RuntimeError: Event loop is closed# Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x000002712CEB0EE0>loop = asyncio.get_event_loop()loop.run_until_complete(main())

python爬虫的线程、进程、异步的基础讲解相关推荐

  1. python结束进程树_【python爬虫】线程进程

    关注:程序运行速度---->主要是由cpu(大脑)来决定. 想要提高程序的运行速度----->提高cpu利用率. 提高cpu的利用率由两种途径: 1.让cpu不休息.cpu每时每刻都在处理 ...

  2. 硬核来袭!!!一篇文章教你入门Python爬虫网页解析神器——BeautifulSoup详细讲解

    文章目录 一.BeautifulSoup介绍 二.安装 三.bs4数据解析的原理 四.bs4 常用的方法和属性 1.BeautifulSoup构建 1.1 通过字符串构建 1.2 从文件加载 2.Be ...

  3. python爬虫系列:xpath爬取图片讲解(零基础向)

    系列文章目录 python爬虫系列:BeautifulSoup爬取小说讲解(零基础向)(版权问题下架) python爬虫系列:requests下载酷我音乐讲解(零基础向)(版权问题下架) 文章目录 目 ...

  4. Python爬虫——使用线程池爬取同程旅行景点数据并做数据可视化

    大家好!我是霖hero 正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢? 今天将 ...

  5. python爬虫百度地图_零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)...

    实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬 ...

  6. 零基础学习python爬虫_教你零基础如何入门Python爬虫!

    Python爬虫好学吗?看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Python爬虫. 一:爬虫准 ...

  7. Python爬虫必备知识点--整理核心基础

    Python爬虫基础语法相关 1. if条件判断 if 条件:         # 事情1     else:         # 事情2 2. while循环 while 条件:         循 ...

  8. 2021最新《python爬虫从0-1》5.正则表达式讲解

    正则表达式讲解 常用正则表达式 re库 re.search re.findall 教程地址 常用正则表达式 字符 描述 \d 代表任意数字,就是阿拉伯数字 0-9 这些玩意. \D 大写的就是和小写的 ...

  9. python爬虫scrapy安装_零基础写python爬虫之爬虫框架Scrapy安装配置

    前面十章爬虫笔记陆陆续续记录了一些简单的Python爬虫知识, 用来解决简单的贴吧下载,绩点运算自然不在话下. 不过要想批量下载大量的内容,比如知乎的所有的问答,那便显得游刃不有余了点. 于是乎,爬虫 ...

  10. 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

最新文章

  1. python八大选择排序_Python实现选择排序
  2. JAVA test代码运行
  3. POJ 1671 第二类斯特林数
  4. wps单机无网络版_单平台销量破百万,这个国产单机系列要出网游,还要上主机...
  5. php关闭当前页_php如何直接关闭页面注销SESSION
  6. html多级折叠菜单表单,JS实战篇之收缩菜单表单布局
  7. git啊,你让我好费劲啊
  8. [原创]Nexus5 内核编译烧录过程记录
  9. oracle国家字符集
  10. [IOS]使用UIScrollView和UIPageControl显示半透明帮助蒙板
  11. java将date类型转成yyyymmdd_java中的Date怎么转换成YYYYMMDD形式的
  12. 女生做数据分析师累吗?零基础可以转行吗?
  13. linux光盘映像文件挂载,linux系统挂载光盘镜像ISO的方法
  14. C语言实现扫雷完整算法详解~(附完整代码~)
  15. 存储过程和触发器-LOGON/LOGOFF触发器
  16. 转:成为Java高级程序员需要掌握哪些?
  17. 前端工程师简历怎么写才更容易进入面试呢?
  18. 【历史上的今天】9 月 11 日:Adobe 公司联合创始人出生;现代游戏机鼻祖诞生;谷歌推出 Android Pay
  19. 了解Oracle RAC Brain Split Resolution集群脑裂协议
  20. When you are old

热门文章

  1. 墨菲定律和海恩法则、事故调查“四不放过”原则--运维
  2. idea文件名颜色的区别
  3. P2168 [NOI2015]荷马史诗
  4. 《算法竞赛进阶指南》荷马史诗
  5. 计算机磁盘管理没有打开方式,Win10系统双击磁盘和文件夹打不开提示没有与之关联的程序怎么办...
  6. 负温度相对湿度与绝对湿度换算
  7. 学号在java是什么意思_在JAVA程序中增加姓名学号
  8. BoomBeach海水效果实现
  9. 推鹿是什么?推鹿介绍,推鹿是什么平台?
  10. iOS 苹果登录(第三方登录)