‘壹’ python的问题
IDE选用这里推荐两款常用的 IDE,可以按照自己的条件和场景来选择。PyCharmPyCharm 是由 JetBrain 的人员制作的 IDE,该团队负责最着名的 Java IDE,IntelliJ IDEA之一。PyCharm 的界面和功能对于那些有使用过其他 JetBrain 产品的人来说,是完美的。 此外,如果您喜欢 IPython 或 Anaconda 发行版,那么 PyCharm 可以将其工具和库(如NumPyMatplotlib)集成在一起,从而让您可以使用数组查看器和交互式图表。Thonny现在的开发工具太多了,而且每个开发工具都致力于做成最好用最智能的工具,所以功能越堆越多,越怼越智能。安装这些开发工具比较烧脑,经常需要经过许多配置步骤。作为一个 Python 开发者来说,好多人光是这些配置都要弄半天。配置好之后,打开软件,发现满屏都是菜单、按钮,无从下手,学习这些功能使用又是一大难题。这是一款对初学者特别友好的开发 IDE,它是由爱沙尼亚的 Tartu 大学开发,十分易于上手,还支持插件。如果你有编程基础,会其他编程语言,那么建议你用Pycharm。如果你是编程小白,或者零基础上手,那么建议你用Thonny。入门首先要学习Python基础知识,直接上课程:Python 环境搭建Python 基础语法Python 变量与数据类型Python 流程控制Python函数Python 模块和包Python 数据结构--序列Python ListPython tupplePython 类与对象Python 字典Python 集合Python 函数的参数Python 高阶函数Python 输入输出Python 错误和异常Python 之引用Python 之迭代器Python 之装饰器Python NameSpace & ScopePython Standard Library 01Python Standard Library 02Python datetime 和 timePython 垃圾回收机制Python 到底是值传递还是引用传递Python 之对象的比较与拷贝进阶通过上面基础知识的学习,相信你已经知道Python是个什么玩意了,对它也有一个初步的了解,对它的入门知识点也有些印象了。这时候你需要进阶学习,在入门的基础上更进一步。下面就从 Python 模块、Python爬虫基础、Python Web开发、Python 数据库操作、Python 数据分析及数据科学、Python IO及异步、Python网络编程、Python图像处理、Python 办公、Python 机器学习、Python 可视化 这些Python的基础大类来进行深入学习。Python 模块Python os 模块详解Python shutil 模块Python sys 模块详解Python queue 模块详解Python collections 模块Python random 模块Python logging 模块详解Python 枚举Python json&picklepathlib 模块Python calendar 模块Python math 模块Python decimal 模块Python itertools 模块Python statistics 模块Python operator 模块Python paramiko 模块Python filecmp&difflib模块初识 Python 多线程Python 多线程之 threading 模块Python Queue 进阶用法Python multiprocessing 模块Python 线程池Python 多线程 EventPython爬虫基础爬虫介绍Python 爬虫之 urllib 包基本使用Python 用户登录 Flask-LoginPython Requests 库的基本使用Python Requests 库高级用法正则表达式XPath 和 lxml爬虫利器 Beautiful Soup 之遍历文档PyQuery 详解爬虫利器 Beautiful Soup 之搜索文档Selenium 环境配置Selenium详解Python Scrapy 爬虫框架及搭建Python Scrapy 项目实战PySpider框架的使用Scrapy 模拟登陆Python 解析 XML爬取微信公众号文章内容Python 爬取豆瓣电影 top 250Python newspaper 框架Python Web开发Web 开发 Flask 介绍Web开发 Jinja2模板引擎Flask 框架集成BootstrapWeb表单Flask数据持久化Web 开发 RESTfulPython Web开发 Django 简介Python Django 模型概述与应用HTTP 入门Python Web 开发之 JWT 简介Python Web开发 OAuth2.0 简介OAuth2.0 客户端实战Flask 单元测试Web 开发 Django 管理工具Web 开发 Django 模板Flask 项目结构Python 数据库操作Python 操作 Redis 数据库介绍Python 操作 SQLitePython 操作 MongoDB 数据库介绍Python 操作 MySQLPython SQLAlchemyPython 数据分析及数据科学数据分析之 Numpy 初步NumPy Ndarray 对象及数据类型NumPy 字符串操作NumPy 数学函数NumPy 统计函数NumPy 排序和筛选函数NumPy 位运算与算术函数数据分析之 pandas 初步NumPy 矩阵Numpy 中数组和矩阵的区别Python IO及异步文件读写StringIO & BytesIOPython asyncioPython异步之aiohttpPython网络编程TCP 编程UDP 编程Python图像处理图像库 PIL(一)图像库 PIL(二)图像库 PIL 实例—验证码去噪Python 办公Python 操作 ExcelPython 操作 WordPython 解析 PDFPython 操作 CSVPython 机器学习机器学习概览第 112 天:机器学习算法之蒙特卡洛Python XGBoost 算法项目实战三木板模型算法项目实战第116天:机器学习算法之朴素贝叶斯理论机器学习算法之 K 近邻第120天:机器学习算法之 K 均值聚类机器学习之决策树Python 可视化Python matplotlib introctionPython Matplotlib 进阶操作Seaborn-可视化统计关系Seaborn-可视化分类数据Seaborn-可视化数据集的分布实战Python的知识点学完了之后,并不代表学完了。这只能代表你会Python了,并不能表示你可以去找工作、你可以去接单了。因为你还缺乏实战练习,这个阶段需要你能从一个实际需求中进行建模,然后用Python去实现模型,得到预期的结果。这里列一些贴近工作生活实际的小项目,每个项目都能让你学习到如何进行需求建模,如何用代码去实现,去解决实际的问题。解析网络网盘链接:几行代码,网盘链接提头来见!揭露出轨女友:女友加班发自拍,男友用几行代码发现惊天秘密...爬取小程序:不能爬小程序,叫什么会爬虫解密当代女性胸围:我半夜爬了严选的女性文胸数据,发现了惊天秘密制作签名软件:牛逼!用Python为她设计专属签名软件!识别车牌:如何用 Python 识别车牌?追女神:用Python助女神发朋友圈下载知乎美女图片:Python 抓取知乎几千张小姐姐图片是什么体验?炒股赚钱:一份代码帮我赚了10万写小游戏:不到 150 行代码写一个 Python 版的贪吃蛇抠图无烦恼:Python装逼指南——五行代码实现批量抠图跟踪房价数据:看我如何抓取最新房价数据跟女友恶作剧:女友电脑私存撕葱帅照,我用python偷梁换柱...自动抢红包:强大!用 60 行代码自动抢微信红包下载B站视频:使用 Python 下载 B 站视频更多精彩可以关注我的专栏:我是@无欢不散,看到这里的朋友请帮忙点个赞,也可以关注 @无欢不散 不迷路。
‘贰’ python 什么是异步通信
异步通信是一种很常用的通信方式。
相对于同步通信,异步通信在发送字符时,所发送的字符之间的时隙可以是任意的,当然,接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。内部处理器在完成了相应的操作后,通过一个回调的机制,以便通知发送端发送的字符已经得到了回复。
‘叁’ python2.7怎么实现异步
改进之前
之前,我的查询步骤很简单,就是:
前端提交查询请求 --> 建立数据库连接 --> 新建游标 --> 执行命令 --> 接受结果 --> 关闭游标、连接
这几大步骤的顺序执行。
这里面当然问题很大:
建立数据库连接实际上就是新建一个套接字。这是进程间通信的几种方法里,开销最大的了。
在“执行命令”和“接受结果”两个步骤中,线程在阻塞在数据库内部的运行过程中,数据库连接和游标都处于闲置状态。
这样一来,每一次查询都要顺序的新建数据库连接,都要阻塞在数据库返回结果的过程中。当前端提交大量查询请求时,查询效率肯定是很低的。
第一次改进
之前的模块里,问题最大的就是第一步——建立数据库连接套接字了。如果能够一次性建立连接,之后查询能够反复服用这个连接就好了。
所以,首先应该把数据库查询模块作为一个单独的守护进程去执行,而前端app作为主进程响应用户的点击操作。那么两条进程怎么传递消息呢?翻了几天Python文档,终于构思出来:用队列queue作为生产者(web前端)向消费者(数据库后端)传递任务的渠道。生产者,会与SQL命令一起,同时传递一个管道pipe的连接对象,作为任务完成后,回传结果的渠道。确保,任务的接收方与发送方保持一致。
作为第二个问题的解决方法,可以使用线程池来并发获取任务队列中的task,然后执行命令并回传结果。
第二次改进
第一次改进的效果还是很明显的,不用任何测试手段。直接点击页面链接,可以很直观地感觉到反应速度有很明显的加快。
但是对于第二个问题,使用线程池还是有些欠妥当。因为,CPython解释器存在GIL问题,所有线程实际上都在一个解释器进程里调度。线程稍微开多一点,解释器进程就会频繁的切换线程,而线程切换的开销也不小。线程多一点,甚至会出现“抖动”问题(也就是刚刚唤醒一个线程,就进入挂起状态,刚刚换到栈帧或内存的上下文,又被换回内存或者磁盘),效率大大降低。也就是说,线程池的并发量很有限。
试过了多进程、多线程,只能在单个线程里做文章了。
Python中的asyncio库
Python里有大量的协程库可以实现单线程内的并发操作,比如Twisted、Gevent等等。Python官方在3.5版本里提供了asyncio库同样可以实现协程并发。asyncio库大大降低了Python中协程的实现难度,就像定义普通函数那样就可以了,只是要在def前面多加一个async关键词。async def函数中,需要阻塞在其他async def函数的位置前面可以加上await关键词。
import asyncio
async def wait():
await asyncio.sleep(2)
async def execute(task):
process_task(task)
await wait()
continue_job()
async def函数的执行稍微麻烦点。需要首先获取一个loop对象,然后由这个对象代为执行async def函数。
loop = asyncio.get_event_loop()
loop.run_until_complete(execute(task))
loop.close()
loop在执行execute(task)函数时,如果遇到await关键字,就会暂时挂起当前协程,转而去执行其他阻塞在await关键词的协程,从而实现协程并发。
不过需要注意的是,run_until_complete()函数本身是一个阻塞函数。也就是说,当前线程会等候一个run_until_complete()函数执行完毕之后,才会继续执行下一部函数。所以下面这段代码并不能并发执行。
for task in task_list:
loop.run_until_complete(task)
对与这个问题,asyncio库也有相应的解决方案:gather函数。
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(execute(task))
for task in task_list]
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
当然了,async def函数的执行并不只有这两种解决方案,还有call_soon与run_forever的配合执行等等,更多内容还请参考官方文档。
Python下的I/O多路复用
协程,实际上,也存在上下文切换,只不过开销很轻微。而I/O多路复用则完全不存在这个问题。
目前,Linux上比较火的I/O多路复用API要算epoll了。Tornado,就是通过调用C语言封装的epoll库,成功解决了C10K问题(当然还有Pypy的功劳)。
在Linux里查文档,可以看到epoll只有三类函数,调用起来比较方便易懂。
创建epoll对象,并返回其对应的文件描述符(file descriptor)。
int epoll_create(int size);
int epoll_create1(int flags);
控制监听事件。第一个参数epfd就对应于前面命令创建的epoll对象的文件描述符;第二个参数表示该命令要执行的动作:监听事件的新增、修改或者删除;第三个参数,是要监听的文件对应的描述符;第四个,代表要监听的事件。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
等候。这是一个阻塞函数,调用者会等候内核通知所注册的事件被触发。
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,
int maxevents, int timeout,
const sigset_t *sigmask);
在Python的select库里:
select.epoll()对应于第一类创建函数;
epoll.register(),epoll.unregister(),epoll.modify()均是对控制函数epoll_ctl的封装;
epoll.poll()则是对等候函数epoll_wait的封装。
Python里epoll相关API的最大问题应该是在epoll.poll()。相比于其所封装的epoll_wait,用户无法手动指定要等候的事件,也就是后者的第二个参数struct epoll_event *events。没法实现精确控制。因此只能使用替代方案:select.select()函数。
根据Python官方文档,select.select(rlist, wlist, xlist[, timeout])是对Unix系统中select函数的直接调用,与C语言API的传参很接近。前三个参数都是列表,其中的元素都是要注册到内核的文件描述符。如果想用自定义类,就要确保实现了fileno()方法。
其分别对应于:
rlist: 等候直到可读
wlist: 等候直到可写
xlist: 等候直到异常。这个异常的定义,要查看系统文档。
select.select(),类似于epoll.poll(),先注册文件和事件,然后保持等候内核通知,是阻塞函数。
实际应用
Psycopg2库支持对异步和协程,但和一般情况下的用法略有区别。普通数据库连接支持不同线程中的不同游标并发查询;而异步连接则不支持不同游标的同时查询。所以异步连接的不同游标之间必须使用I/O复用方法来协调调度。
所以,我的大致实现思路是这样的:首先并发执行大量协程,从任务队列中提取任务,再向连接池请求连接,创建游标,然后执行命令,并返回结果。在获取游标和接受查询结果之前,均要阻塞等候内核通知连接可用。
其中,连接池返回连接时,会根据引用连接的协程数量,返回负载最轻的连接。这也是自己定义AsyncConnectionPool类的目的。
我的代码位于:bottle-blog/dbservice.py
存在问题
当然了,这个流程目前还一些问题。
首先就是每次轮询拿到任务之后,都会走这么一个流程。
获取连接 --> 新建游标 --> 执行任务 --> 关闭游标 --> 取消连接引用
本来,最好的情况应该是:在轮询之前,就建好游标;在轮询时,直接等候内核通知,执行相应任务。这样可以减少轮询时的任务量。但是如果协程提前对应好连接,那就不能保证在获取任务时,保持各连接负载均衡了。
所以这一块,还有工作要做。
还有就是epoll没能用上,有些遗憾。
以后打算写点C语言的内容,或者用Python/C API,或者用Ctypes包装共享库,来实现epoll的调用。
最后,请允许我吐槽一下Python的epoll相关文档:简直太弱了!!!必须看源码才能弄清楚功能。
‘肆’ python requests 是异步的吗
我找了一下requests本身没有异步功能有一个库grequests,但网上就一个范例你需要把会发起请求的过程封装成一个函数,然后用gevent.spawn调用。这个和多线程是类似的,只在一个Greenlet里面当然还是顺序执行的。
‘伍’ 做网络爬虫,python 的多线程,异步和 node.js 的异步哪个好
异步当然是Node.js远强过Python的。
这主要体现在省去了线程调度时的内存等各方面的消耗。
另外Node.js在爬虫市场的生态也逐渐成熟,而python依然是bs那一套。实际上js本身就更适合处理dom(cheerio\jsdom)
‘陆’ 【Python基础】http请求是同步还是异步
同步的
一般http请求都是同步,意味着你调用网络时候必须等着结果返回不能干别的事
如果是异步需要自己包装,也有这样的库了
‘柒’ python 什么是http异步请求
http请求为耗时IO操作,如果同步阻塞的话,进程会等待请求完成。
异步的话,进程会发出http请求(请求以后不需要cpu),然后跳转到别的任务,直到http请求完成,再调回来继续处理得到的http回应。
最经典的例子就是烧水,同步阻塞就是你一直蹲在炉子旁边等待水烧开,而异步是把水壶放在炉子上,等水开了以后茶壶会叫,这时候你听到声音就会回来处理开水~