Python分布式异步任务队列库-Celery学习-01

最近在项目上遇到了单机性能瓶颈,故趁此机会准备让项目中耗时的部分升级为分布式处理。考虑如果用C++来进行开发的话周期太长,而且很容易出现问题,于是乎初步选择了 Python 和Celery库来解决问题。

注:本文将以Celery 4.X版本为基础。

1、Celery 简介

它是一个异步任务调度工具,用户使用 Celery 产生任务,借用中间人来传递任务,任务执行单元从中间人那里消费任务。任务执行单元可以单机部署,也可以分布式部署,因此 Celery 是一个高可用的生产者消费者模型的异步任务队列。你可以将你的任务交给 Celery 处理,也可以让 Celery 自动按 crontab 那样去自动调度任务,然后去做其他事情,你可以随时查看任务执行的状态,也可以让 Celery 执行完成后自动把执行结果告诉你。

2、Celery 基本概念

任务生产者 :调用Celery提供的API,函数,装饰器而产生任务并交给任务队列的都是任务生产者。

任务执行单元(Worker):Worker是Celery提供的任务执行的单元,Worker并发的运行在分布式的系统节点中

中间人(Broker):Celery 中通常使用中间人(Broker)在客户端和工作者(Worker)之间传递。在任务生产者向队列添加消息后Broker把消息传递给 Worker。

后端(Backend):Celery 中用于储存Worker执行完毕后的结果。

官方给出的实现Broker的工具包括:

NameStatusMonitoringRemote Control
RabbitMQStableYesYes
RedisStableYesYes
Amazon SQSStableNoNo
ZookeeperExperimentalNoNo

更多信息可参阅:http://docs.celeryproject.org/en/latest/getting-started/brokers/index.html

3、Celery 安装

正常来说安装是很简单的只需要pip install一下就可以了。



		


4、第一个Celery应用程序

这里我们选择使用 Redis 作为中间人和后端。

由于Redis使用的非常广泛,介绍也很多,这里不单独讨论了。

4.1、Worker

作为分布式的程序当然需要有具体干活的代码,Worker就是这个干活的代码。

这里直接贴出代码,可直接保存为add_tasks.py。



		


这个例子里添加了一个最基本的工作函数add,用来计算两个参数的和。

唯一需要注意的一点是,由于Windows下没有fork函数,所以如果Celery是在Windows下运行需要设置环境变量”FORKED_BY_MULTIPROCESSING”为1.

cmd下可以使用命令进行设置 (关闭后失效)
set FORKED_BY_MULTIPROCESSING=1

这里例子中直接使用了os包自动根据操作系统来设置。

启动worker可以使用命令celery -A add_tasks worker -l info

或者:python add_tasks .py worker

如果有疑问可以使用 celery –help 命令来查看celery命令的帮助文档。

4.2、生产者

有了完成任务的工作者当然也还需要一个负责添加任务的生产者。

下面是生产者的代码。命名为start_tasks.py。



		


代码很简单,注释也写的比较清楚,这里不做过多的解释。保存为文件后可直接运行,通过输出我们可以观察到执行的过程和结果。
如果需要更多的工作者,可以把worker拷贝到更多计算机并行运行,需要注意的是IP是否正确,redis这样的中间人是否能够被其他计算机正确访问。

友情提示:redis默认无密码,直接允许公网访问有极大风险,可能会直接导致服务器被入侵。请务必设置一个强大难以破解的密码并设置防火墙阻止他人访问。

是时候该抛弃GSM网络了-新型伪基站诈骗法的防范

近日 江宁公安在线 在微博上发布了一条引发激烈舆论的微博( https://weibo.com/1113218211/GsVOZ1hwZ ),文中描述了一种新型的伪基站诈骗法,能够嗅探用户的短信内容。其中写到“此类劫持和嗅探并不仅限于 GSM 手机,包括 LTE,CDMA 类的 4G 手机也可能会受到相应威胁。”以及“一个坏消息是,此技术目前基本上没有办法防范。”

攻击原理:
首先我们得需要了解,在中国大陆境内主要的电信运营商有3家,分别是中国电信,中国联通,中国移动。其中中国电信的2G网络制式为CDMA,其余两家的2G网络制式都为GSM,本文讨论的攻击方式仅针对GSM,所以中国电信的用户可以忽略本文。
GSM网络比较古老,采用了单向鉴权的用户认证方式以及弱加密方式(甚至于无加密)存在比较大的安全问题。在网络上随手一搜即可搜到很多关于GSM嗅探的文章,并且攻击成本十分的低廉。
具体的内容大家有兴趣可以自行搜索,这里我只讲一个大概。
当用户手机以GSM网络连接到信号基站的时候,如果有短信需要发送给基站上的某个用户,基站会把短信以广播的方式通知在使用此基站的所有终端,也就是说如果有任意攻击者连接到基站,就可以收到所有通过此基站传送的短信。
虽然现代手机大多数都会默认使用3G或者4G网络进行通信,但是在遇到信号不好或者其他情况的时候往往手机会为了保障通信自动降级为GSM网络进行通信,所以就产生了很严重的安全问题。

解决方案:
针对部分Android手机用户可以在操作系统中选择拒绝使用GSM网络来预防攻击。
以LineageOS为例,联通用户可以在移动网络设置中选择仅使用WCDMA和LTE网络。
移动用户可以在移动网络设置中选择仅使用TD-SCDMA和LTE网络。

注:部分手机的操作系统可能不提供SIM卡的移动网络设置功能。可以尝试在拨号界面输入*#*#4636#*#会弹出手机测试的界面,找到手机信息菜单,设置首选网络类型(移动用户可以选TD-SCDMA/LTE,联通用户可以选LTE/WCDMA)这样即可屏蔽GSM网络。

PC上通过Proxy使用Line

最近非常的不太平,而微信的安全性和私密性始终无法让人满意,所以逼不得已只能转而去使用各种由非大陆提供的聊天软件。
本人也试用过一些聊天软件,目前来看Line还是比较让人满意的一种选择。
唯独遗憾的是Line的PC客户端在Windows 8或者Windows 10上工作时软件提供的代理(Proxy)功能运行并不是很正常甚至因为DNS污染的原因无法正常登陆使用,经过本人尝试在这里提出几个解决方法。

方法1、全平台适用,无论是Linux用户还是Windows又或者Mac OS都可以使用Google Chrome版本的Line来登陆。
这个方法非常的简单,安装Google Chrome以后设置好代理,在访问Chrome商店安装Line提供的插件即可。
对于主要使用Chrome浏览器的人来说,如果设置全局代理不太方便,可以通过安装SwitchyOmega等插件的方式来管理代理。

方法2、通过Proxifier来代理Line客户端
由于Chrome版本提供的功能比较简单,还是需要使用完整版的Line客户端,这里也提供一种解决方法。
Proxifier是一款功能非常强大的代理软件,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理访问网络。
首先下载Line客户端,这里不细说了。
官网地址:https://line.me/zh-hans/download
接着需要安装Proxifier(这里注意Proxifier为付费软件,如果用的满意建议支持正版)
官网地址:http://www.proxifier.com/
安装完成之后
需要打开主界面找到Profile菜单找到Proxy Server设置代理服务器。
如图所示:


我本人使用的是V2ray,所以选择了SOCKS5,大家需要根据自己使用的代理填写。
接着需要设置使用代理的程序
需要打开主界面找到Profile菜单找到Proxification Rules

单击后会弹出如下的对话框

如上图所示,这里我们设置了V2ray等软件不通过代理直接连接,不匹配任何规则的直接连接,Line客户端通过设置的代理连接。
接着有一点需要注意,一般的软件到这里就可以通过代理上网了,但是由于Line所使用的域名被DNS污染了无法得到正确的结果,所以还需要设置DNS全部走代理。
需要打开主界面找到Profile菜单找到Name Resolution

弹出的对话框中,勾选通过代理解析主机名

确定后即可愉快的使用Line了。

注意,Proxifier退出后则不会继续走代理,所以每次使用Line前需要先启动Proxifier。
如果嫌弃配置太过麻烦,可以直接使用我提供的配置文件,导入Proxifier后只需要修改一下代理服务器的地址和端口即可。
导入方法file菜单选择import即可

PPX文件下载地址https://www.exvs.org/wp-content/uploads/2018/07/Line_2D6C1EB6.ppx

傻瓜策略-PE_PB优化指数投资法

策略基准:沪深300指数

测试时间:2013-04-01至2018-03-01

策略内容:每隔25个交易日进行一次选股,在全部A股中选出符合如下条件的股票,按照等权比例买入30只股票(如果不满30只则按照实际数量买入,始终保持仓位为100%)。

选股条件:
排除ST,停牌,即将退市股票

市净率小于2

动态和静态市盈率均低于30

净资产收益率(ROE)大于3%

回测结果:

策略收益 146.59%
平均年化收益 20.74%
基准收益 62.28%
最大回撤 27.795%

策略代码:
(策略代码基于生成器生成)

傻瓜策略-PE中位数ETF投资法

回测平台为聚宽 https://www.joinquant.com/

基准指数选择为沪深300指数,交易标的为510310(沪深300ETF)
策略内容:
每个月5日计算沪深300指数的成分股PE,如果PE中位数低于25则满仓买入沪深300ETF,如果PE中位数超过40,则清仓。
测试时间:2013-04-01至2018-03-05
(由于沪深300ETF上市日期为2013年3月29日,固此策略无法追溯的更早)

回测结果:

基准收益 61.04%
策略收益 110.70%
策略年化收益 16.81%
最大回撤 18.637%
Alpha 0.104
Beta 0.373

策略代码: