前言
首先发表一个感想:
信息不对称真可怕呀,最近刚了解到腾讯云和阿里云都早已推出了自家的函数计算服务,拿python来说,可以轻松的解决第三方库依赖,尤其是腾讯云的云函数,这两天体验下来全程无痛苦十分方便,话说回来,我本来还想在django学精后推出一个叫pycron.com的网站用来托管各种python脚本,现在看来似乎没有这个必要了。
实战
实战开始之前先说一下这应该是一个最简单实践,而不是官方推荐的最佳实践。
扫码进入到腾讯云云函数的控制台后,点击函数服务->新建,然后在打开的页面上先填上一个任意的函数名称,再在运行环境里面选择python3.6
,创建方式选择空白函数,点击下一步后我们将来到函数配置,
再说怎么配置之前,我们先来看一下我们这次实战的代码文件目录结构,如下:
1 2 3 4 5 6 |
sharp@linuxmint19:~/Downloads/solidot$ tree . └── solidot.py 0 directories, 1 file |
紧接着,我们来看solidot.py
文件的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#!/usr/bin/env python3 # coding=utf-8 import time import smtplib import requests from bs4 import BeautifulSoup from email.mime.text import MIMEText HOST = 'smtp.qq.com' #smtp服务的供应商 PORT = 587 # smtp服务供应商指定的端口 SENDER='' # smtp服务的发件人,这里我用的是qq邮箱 RECEIVER='' # 任意用来接收邮件的邮箱地址 PWD='' # 提供smtp服务的邮箱的授权码,注意不是邮箱密码 def mail_send(subject, mail_body): try: msg = MIMEText(mail_body, 'plain', 'utf-8') msg['Subject'] = subject msg['From'] = SENDER msg['To'] = RECEIVER s = smtplib.SMTP(HOST, PORT) s.debuglevel = 0 s.login(SENDER, PWD) s.sendmail(SENDER, RECEIVER, msg.as_string()) s.quit() except smtplib.SMTPException as e: print(str(e)) exit(1) def get_soup(): url = 'https://www.solidot.org/index.rss' rss_xml = requests.get(url).text soup = BeautifulSoup(rss_xml, 'xml') return soup def get_mail_body(): contents = get_soup().select('item')[0:9] contents_list = [] for c in contents: title = c.select_one('title').get_text() link = c.select_one('link').get_text() contents_list.append(title + ' ' + link) return '\n'.join(contents_list) def main(arg1, arg2): current_time = time.strftime("%Y-%m-%d", time.localtime()) mail_send(subject=current_time + ' Solidot今日文章', mail_body=get_mail_body()) print('成功发送了一封邮件!') |
这里我们的入口函数为main()
,说到这里我们需要注意以下两点:
- 不需要再调用你的主函数
- 你的主函数
main()
需要设置两个位置形参如arg1,arg2
,尽管不使用但必须要这样设置否则测试运行的时候会报错
然后我们来说一下上面的这一份实战代码是干什么用的,他是用来读取solidot这个资讯网站的rss源码然后给你发送一封包含该网站发布的主题和对应url的邮件用的,在你在云函数控制台测试运行上面这一段代码之前,先要修改代码开头的这些配置:
1 2 3 4 5 6 |
HOST = 'smtp.qq.com' #smtp服务的供应商 PORT = 587 # smtp服务供应商指定的端口 SENDER='' # smtp服务的发件人,这里我用的是qq邮箱 RECEIVER='' # 任意用来接收邮件的邮箱地址 PWD='' # 提供smtp服务的邮箱的授权码,注意不是邮箱密码 |
好了,交代完这些杂七杂八的东西后我们继续咱们的函数配置部分的教程,如下:
这里最主要的是执行方法和提交方法的填写:
- 执行方法:由于咱们的脚本的脚本名叫
solidot.py
,而脚本内的主函数是main()
所以这里咱要填solidot.main
- 提交方法:由于咱是本地打包依赖所以选
本地上传zip包
接着说一下如何打包(官方推荐在centos7下面打包),用zip打包之前需要回顾一下咱们的代码文件结构:
1 2 3 4 5 6 |
sharp@linuxmint19:~/Downloads/solidot$ tree . └── solidot.py 0 directories, 1 file |
这里需要注意在zip打包之前你要确保你的py脚本文件在其内部,
然后执行下面的命令即可:
1 2 3 |
$ pip3 install lxml beautifulsoup4 -t solidot/ $ cd solidot $ zip solidot.zip * -r |
再然后我们把这个打好的包solidot.zip
点击上传,再点完成就创建好了一个可以运行的云函数项目了。
这样子你就可以切换到函数代码
这个功能区进行测试了,测试通过后再切换到触发方式
功能区添加一个触发方式就行了,我就不赘述了。
比较
下面和阿里云推出的函数计算比较一下,比较之前先说一下结果,这一波我站腾讯云的云函数:
腾讯云云函数:
优点
- 命令行工具scf不需要依赖docker,虽然按照阿里云官方文档的说法能避免由于开发环境和运行环境不一致所引起的一些问题,但对于初次使用来说也无疑增加了初次使用的门槛和成本,不过话说回来这两天实战腾讯云云函数的时候,虽然pip安装了scf命令行工具但最终也没用,还是用控制台来上传的包括依赖的代码包
- 比较惊喜的是我实战的第二个python项目依赖了python的第三方库
lxml
(这个是一个依赖C语言的某些个库封装的python wrapper),只是在官方推荐的centos7下面用zip打包了一下,然后在云函数控制台直接上传zip包点击测试运行,什么错也没报 - 自带的python的第三方库很多,比阿里云多好多
缺点
- 官方文档整体比较简单,我看阿里云那篇还有一篇成本优化最佳实践的文章,虽然我没点进去看,不过从这可以看到阿里云还是比较为用户考虑的,不过话又说回来了,我发现腾讯云的云函数文档也不是说简单什么的,而是该详细的详细,该简单的简单,爱了❤️
阿里云函数计算:
优点
- 文档文档非常详细,粗略的扫了一下,文档非常有深度,看上去比腾讯云的要唬人一些😁
缺点
- 命令行工具官方最佳实践推荐用docker,多了一层门槛,我赶脚比较麻烦
- 阿里云文档里面的Python 打包示例还提到了要新建一个 template.yml,又是一个麻烦的地方,溜了溜了
- 自带的python第三方库比腾讯云的少好多,不得不说连个
requests
都不支持,而且除了自家的几个库之外就真的没几个了
二者共同的问题
- 二者的控制台编写函数文档好像都不提控制台可以上传打包好依赖的代码包,而是在一股脑的狂推用自家的命令行工具部署代码包,麻烦死