OSCHINA 本期高手问答(9月27 日-10月 7日) 我们请来了@dongwm(董伟明)为大家解答关于Python3编程方面的问题。
@dongwm(董伟明),豆瓣高级产品开发工程师,主要负责豆瓣读书、电影、音乐、东西等产品线。从2011年开始接触Python, 从运维、运维开发到现在的Web开发,积累了丰富的运维和开发经验,他积极参与开源项目,给IPython、pip及Python标准库等贡献过代码。这本书是他这些年使用Python进行Web开发,对各方面知识理解和积累经验的梳理和总结。
个人博客是http://www.dongwm.com,GitHub地址为https://github.com/dongweiming
Python是如此活跃的一种语言,几乎伴随互联网的发生而创立,又伴随互联网的极速发展而繁荣。使用Python会遇到这样的问题:什么时候该用多进程?怎样提高代码执行效率?Flask为什么流行?学习Python要不要直接学Python 3? Python 3有哪些优点,迁移成本如何?豆瓣这种大厂对Python有何看法?
带着这些问题,相信大家会在此次答疑活动以及《Python Web开发实战》一书中找到想要的答案。
为了鼓励踊跃提问,@博文视点会在问答结束后从提问者中抽取 5 名幸运会员赠予《Python Web开发实战》一书。
购买链接:http://dwz.cn/4aO1yb
OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。
下面欢迎大家就Python3编程方面问题向@dongwm(董伟明)提问,请直接回帖提问。
OSC 第 128 期高手问答 -- Python3 开发实战
@壁_花 @idisikx @hell0cat @DarkAngel @北京老爷们儿
恭喜以上五位网友或获得《Python Web开发实战》图书一本
请私信 @博文视点 告知快递信息(格式:姓名+电话+地址+邮编号码)!
######@dongwm :不知作者有没有涉及过大数据方向的?我看部分大数据相关的都要用到python这是为什么?Hadoop整个生态圈都是Java的,python的定位是什么?######@dongwm :其实我是一个狂热的Python爱好者,但是还是想问:
用Python来进行Web开发,与它的其他竞争者相比,有什么优势呢?比如,与Ruby On Rails相比,它能更敏捷(快速)地开发,用写尽量少的代码来完成任务吗?与Node.js和Golang相比,它在支持高并发、多线程、执行性能等方面有什么优势吗?如果一些性能方面的优化可以通过编写C扩展模块,或者通过cffi、Boost.Python、Cython等方式进行优化,Node.js、Ruby等同样可以做到。一句话概括上面的问题就是:是什么原因吸引我们使用Python来进行Web开发呢?######@dongwm : 按照“没有银弹”一说,python应该也有自己的适用范围吧,是不是比较适用于机器学习,不适合于web开发呢?######Python被称为「胶水语言」,虽然没有「统治」哪个领域,但是基本上个个领域都把手伸了进去。 机器学习我不熟不敢妄谈是不是更合适。我只能说,Python很适合web开发######使用豆瓣很多年,很喜欢豆瓣的风格。之前一直是在网页端浏览,后来又到了手机app端。我总体感觉豆瓣的进步很快。我想问的问题是,python web一直作为豆瓣的开发首选,是因为什么?还有关于豆瓣的权限模块的设计时,python web发挥了什么优势。作为手机端app的开发,python web会起到什么作用吗?######回复 @机器猫123 : 会的。也许不会开源,但是酱厂里面确实有很多不错的实现######回复 @dongwm : 未来豆瓣会继续用python web衍生开发新的产品吗?######回复 @dongwm : 谢谢老师的回答。######豆瓣选择Python,其实是公司和语言的风格很相似的缘故吧。我们做事喜欢优雅,清晰,高效,这这好也是Python希望的。 豆瓣的基础设施基本都是使用Python完成,包含权限部分,但是Python web和权限模块设计感觉没啥直接的关系,就是抽出来的库和使用它的关系,我也没懂有什么优势或者劣势。 豆瓣app的API后端是使用PythonWeb完成的######
之前学ROR是因为老师要求用这个,我没有用Python进行Web开发的经验,稍微有一点了解的也只是Flask或者Falcon这种轻量级的,感觉能够快速开发小巧的应用,但是不知道有哪个特别出名的应用或者网站系统是由Python开发的(比如WordPress和Discuz用的PHP,Gitlab用的Ruby,OSC好像用的是Java吧)。Python确实是一种比较万能的语言,但有点万金油却不够专精的感觉。比如在科学计算方面很流行,但是论效率不如Julia,论支持库的丰富和使用广泛度不如Matlab(特别是学校里面,教授做研究或者教学一般都会用Matlab);在系统管理方面看,能用Python干的脚本化工作,用shell或者perl基本上都能干,而且需要写的代码行数说不定更少。如果说用Python进行Web开发效率高,是有特指某一个框架吗,还是泛指?
我在写程序时首先会想到用Python,是因为喜欢tial-and-error这种方式,能够在正式写代码前确认想法能不能实现,能够让我有兴趣和信心继续下去。但真要说起来,能够提供REPL特性的语言也不少。
Python的执行效率貌似永远是Python热门的讨论话题,比如GIL的存在必须要用特殊的方式来优化。像gevent和Tornado之类的存在也适用于高并发的网络连接(不过Python在这方面的性能不一定是最高的,没有看过相关的测试)。再说Python的实现,除了最出名的CPython和PyPy之外,甚至还有为嵌入式设备开发的MicroPython(这也在另一方面说明了Python的万能性)。Dropbox的技术栈中也使用了Python,并且有开发面向性能的Python实现pyston,此外还有Stackless Python(听名字感觉很厉害,虽然其实我并没有去了解这到底是什么),但它家也在用Golang和Rust开发高性能的东西。那么,豆瓣的基础设施实现中,用Python开发的应用效率如何?也有使用除了CPython之外的实现来进行优化吗?(我是不是扯得有点偏题了?)
######回复 @dongwm : 那么用Python来开发Web,是否属于那种会带来这种优势的选择呢?或者有没有哪家公司通过把技术栈切换到Python而带来了这种进步?######回复 @dongwm : 以现在的硬件发展水平,基本上任何数量级的访问都可以通过硬件的堆砌获得支持。不过经常会看到新闻,比如某某公司将它的某某技术构架从XX语言切换到了YY语言,然后获得了性能提升、提高了稳定性、减少了部署的服务器等优势,(我记忆中有看到Twitter的新闻,PHP 7的新闻,还有一些其他的)。######豆瓣每天服务着千万级别的用户(抱歉不能说具体数字)的请求,绝大多数应用和基础设施都是Python实现的。所以应用效率不用担心。虽然可以使用C/C++的扩展提高运行效率,但是我接触的场景里面很少。相当于写扩展的维护性和成本,大家更愿意从架构,算法等方面来解决。######嚯,你的问题好长。 进行Web开发效率高算是泛指,包含django和flask。效率高也体现在它们的第三方扩展和支持比较完善,基本能想到的都有对应的项目支持,这样少造了很多轮子。###### @dongwm :python的确很好,也很强大,我也一直在用,但我大都做的和web方面没有什么联系.而我对web方面挺感兴趣,但自学起来始终不得要领,进展有点慢,大神能否讲一讲web方面的学习经验,或者flask方面的心得.又或者推荐一些关于web好的学习资源.期待您的回答并致谢.###### @dongwm :了解Python基本知识,希望学习一门Python web框架学习后端开发。之前我对部分主流框架进行了一些了解:Django,Tornado,在知乎上有一个非常活跃的群体。在框架的选择问题上,只有最适合你自己、最适合你的团队的框架。编程语言选择也是一个道理,你的团队Python最熟就用Python好了,其实大部分人是没必要太关心框架的性能的,因为你开发的网站根本就是个小站,能上1万的IP的网站已经不多了,上10万的更是很少很少。在没有一定的访问量前谈性能其实是没有多大意义的,因为你的CPU和内存一直就闲着呢。而且语言和框架一般也不会是性能瓶颈,性能问题最常出现在数据库访问和文件读写上。==========================
Python "RemoteError: Remote error: UnicodeEncodeError 'ascii' codec can't encode ch:报错
{
"traceback": " File \"/opt/stackstorm/st2/lib/python2.7/site-packages/st2actions/container/base.py\", line 99, in _do_run\n LOG.debug('Performing run for runner: %s' % (runner.runner_id), extra=extra)\n File \"/opt/stackstorm/st2/lib/python2.7/site-packages/retrying.py\", line 49, in wrapped_f\n def wrapped_f(*args, **kw):\n File \"/opt/stackstorm/st2/lib/python2.7/site-packages/retrying.py\", line 206, in call\n if not self.should_reject(attempt):\n File \"/opt/stackstorm/st2/lib/python2.7/site-packages/retrying.py\", line 247, in get\n else:\n File \"/opt/stackstorm/st2/lib/python2.7/site-packages/retrying.py\", line 200, in call\n try:\n File \"/opt/stackstorm/runners/mistral_v2/mistral_v2.py\", line 219, in run\n result = self.start(action_parameters=action_parameters)\n File \"/opt/stackstorm/runners/mistral_v2/mistral_v2.py\", line 256, in start\n **options)\n File \"/opt/stackstorm/st2/lib/python2.7/site-packages/mistralclient/api/v2/executions.py\", line 56, in create\n return self._create('/executions', data)\n File \"/opt/stackstorm/st2/lib/python2.7/site-packages/mistralclient/api/base.py\", line 95, in _create\n self._raise_api_exception(resp)\n File \"/opt/stackstorm/st2/lib/python2.7/site-packages/mistralclient/api/base.py\", line 143, in _raise_api_exception\n error_message=error_data)\n",
"error": "RemoteError: Remote error: UnicodeEncodeError 'ascii' codec can't encode character u'\\xae' in position 169: ordinal not in range(128)\n[u'Traceback (most recent call last):\\n', u' File \"/opt/stackstorm/mistral/lib/python2.7/site-packages/oslo_messaging/rpc/server.py\", line 155, in _process_incoming\\n failure = None\\n', u' File \"/opt/stackstorm/mistral/lib/python2.7/site-packages/oslo_messaging/rpc/dispatcher.py\", line 222, in dispatch\\n if hasattr(endpoint, method):\\n', u' File \"/opt/stackstorm/mistral/lib/python2.7/site-packages/oslo_messaging/rpc/dispatcher.py\", line 192, in _do_dispatch\\n new_args[argname] = self.serializer.deserialize_entity(ctxt, arg)\\n', u' File \"/opt/stackstorm/mistral/lib/python2.7/site-packages/mistral/engine/engine_server.py\", line 98, in start_workflow\\n (rpc_ctx, workflow_identifier, utils.cut(workflow_input),\\n', u' File \"/opt/stackstorm/mistral/lib/python2.7/site-packages/mistral/utils/__init__.py\", line 284, in cut\\n return cut_dict(data, length=length)\\n', u' File \"/opt/stackstorm/mistral/lib/python2.7/site-packages/mistral/utils/__init__.py\", line 198, in cut_dict\\n v = str(value)\\n', u\"UnicodeEncodeError: 'ascii' codec can't encode character u'\\\\xae' in position 169: ordinal not in range(128)\\n\"]."
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。