Python异步编程

异步编程

在Python中,由于CPythonGIL限制,不能使用多线程充分利用资源,因此在进行诸如文件存取、网络请求等IO操作的时候极其浪费资源,程序往往要在一个点上空等。虽然Python可以借助多进程来改善,但是进程相比线程来说过重,如果只用多进程就可以完全解决问题,线程这个概念也就不会出现了。

在耗时任务(主要是IO)的操作上,Python提供了一些方法来解决,比如协程的概念。初次了解协程的时候认为这是可以拯救世界的东西,概念新颖,方法独特,但是在了解了如C#的async/await以及Javascript(同样是单线程语言)的async/await之后,明白了基于yield/send的协程仍然使用起来仍然不够顺手。

Python3.4版本之后,Python引入了asyncio标准库,使用@coroutineEventLoop可以更方便地完成Python协程的工作,接着在Python3.5中,Python引入了async/await关键字,彻底简化了Python异步编程流程。自从C#最早提出async/await之后,很多语言都引入了这一机制,因为它真的太好用了,可以完全以同步的风格进行异步编程。不过由于与C#的实现机制不同,在Python协程中仍然有一些具体的细节无法回避,比如send/yield的交互。

工具对比

在Python生态系统中,有很多异步编程库可以使用,这些编程库有的是诞生于Python异步支持之前,自行实现了事件循环,有的是依托于Python的异步机制进一步开发,在进行异步编程的时候,可以借助以下的工具来简化工作:

  • gevent:自己实现了时间循环,很早的异步处理库
  • twisted:非常早的异步网络库,自带HTTP服务器、DNS服务器、邮件服务器等,之后Python官方的asyncio就很大地收到了它的影响
  • tornado:既是异步网络编程库,也是一个成熟的HTTP服务器以及Web框架
  • aiohttp:基于asyncio的网络编程库,可以高效地实现HTTP服务器和Websocket服务器
  • cyclone:作者想要综合twistedtornado两个库,做到implements the Tornado API as a Twisted protocol

Python 'python ImportError: No module named XXX' 问题

最近做毕业设计,用Python写一个文本爬虫,我的目录结构是这样的:

1
2
3
4
5
6
7
StockTextDigger
----src
--------main.py
--------__init__.py
----parser
--------__init__.py
--------source_parser.py

当要从main.py中引用source_parser.py中的一个类时出现了“python ImportError: No module named source_parser”的错误。之前写过的Python从没出现过这样的问题,可是这次无论责骂么都解决不聊,无论是加上 __init__.py 还是sys.path.append(‘XXX’)都没有用,然后忽然意识到parser这个包很有可能已经在默认搜索路径中了,然后改名字,顺利解决。

又一个官逼同的典型例子[摊手]

Python 进行 Web 开发

假期没事学python,因为之前一直在搭个人网站,后台用的是PHP,所以想用Python重写一下后台。关于python开发web应用,网上有一大堆教程,最多的是推荐用apache加载mod_python这个模块,看了下官网,13年停止更新了,而且对Python 3的支持很差,所以并不推荐这个。类似的有mod_msgi,这个可以看做是mod_python的继任者,但是配置起来尤其是在windows上配置起来非常麻烦,初学者做起来可能会比较痛苦。推荐使用Django框架开发,关于服务器官网里有这么一段话:

You’ve started the Django development server, a lightweight Web server writtenpurely in Python. We’ve included this with Django so you can develop thingsrapidly, without having to deal with configuring a production server – such asApache – until you’re ready for production.

也就是Django自带了纯python编写的服务器,非常方便,在测试阶段和小规模的开发阶段,用这个足以满足需求。关于教程,强烈推荐去官网硬着头皮读英文原版(注意教程版本要和自己下载的Django一致)而不要去看翻译完的中文版,因为Django更新很快,而且时不时有大的变动,看比较老的版本的话有时候回给自己造成莫名其妙的困扰。

Django官网:https://www.djangoproject.com/

Python下载:https://www.python.org/

下载完之后,先把python.exe的目录放到环境变量的Path下(Windows系统),然后命令行进入Django目录,执行 [ python setup.py install ] 即可。安装Django成功之后,在Django官网中按照教程一步步来就可以了。