“第一个Celery程序”的版本间的差异
来自CloudWiki
(创建页面,内容为“==Redis配置和启动== 我们以Redis为例,首先修改Redis配置文件redis.conf,修改bind = 127.0.0.0.1为bind =0.0.0.0,意思是允许远程访问Redis…”) |
|||
第32行: | 第32行: | ||
b'bar' | b'bar' | ||
>>> exit()</nowiki> | >>> exit()</nowiki> | ||
+ | |||
+ | ==第一个Celery程序== | ||
+ | |||
+ | <nowiki> | ||
+ | #encoding=utf-8 | ||
+ | |||
+ | from celery import Celery | ||
+ | import time | ||
+ | import socket | ||
+ | |||
+ | app = Celery('tasks', broker='redis://127.0.0.1:6379/0',backend ='redis://127.0.0.1:6379/0' ) | ||
+ | |||
+ | def get_host_ip(): | ||
+ | """ | ||
+ | 查询本机ip地址 | ||
+ | :return: ip | ||
+ | """ | ||
+ | try: | ||
+ | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | ||
+ | s.connect(('8.8.8.8', 80)) | ||
+ | ip = s.getsockname()[0] | ||
+ | finally: | ||
+ | s.close() | ||
+ | return ip | ||
+ | |||
+ | |||
+ | @app.task | ||
+ | def add(x, y): | ||
+ | time.sleep(3) # 模拟耗时操作 | ||
+ | s = x + y | ||
+ | print("主机IP {}: x + y = {}".format(get_host_ip(),s)) | ||
+ | return s | ||
+ | |||
+ | |||
+ | </nowiki> | ||
+ | |||
+ | 代码说明:第7行指定了中间人broker为本机的Redis数据库0,结果后端同样使用Redis;第9~20行定义了一个获取本机IP地址的函数,为后序分布式队列做铺垫;第23行到最后定义了一个模拟虚耗时的任务函数,使用app.task来装饰。 | ||
+ | |||
+ | |||
+ | 运行这个python程序, | ||
+ | |||
+ | celery -A my_first_celery worker --loglevel=info | ||
+ | |||
+ | <nowiki> | ||
+ | /usr/local/Python3/lib/python3.7/site-packages/celery/platforms.py:801: RuntimeWarning: You're running the worker with superuser privileges: this is | ||
+ | absolutely not recommended! | ||
+ | |||
+ | Please specify a different user using the --uid option. | ||
+ | |||
+ | User information: uid=0 euid=0 gid=0 egid=0 | ||
+ | |||
+ | uid=uid, euid=euid, gid=gid, egid=egid, | ||
+ | |||
+ | -------------- celery@localhost.localdomain v4.4.2 (cliffs) | ||
+ | --- ***** ----- | ||
+ | -- ******* ---- Linux-3.10.0-1062.el7.x86_64-x86_64-with-centos-7.7.1908-Core 2020-05-31 11:17:26 | ||
+ | - *** --- * --- | ||
+ | - ** ---------- [config] | ||
+ | - ** ---------- .> app: tasks:0x7f920e95a1d0 | ||
+ | - ** ---------- .> transport: redis://127.0.0.1:6379/0 | ||
+ | - ** ---------- .> results: redis://127.0.0.1:6379/0 | ||
+ | - *** --- * --- .> concurrency: 2 (prefork) | ||
+ | -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) | ||
+ | --- ***** ----- | ||
+ | -------------- [queues] | ||
+ | .> celery exchange=celery(direct) key=celery | ||
+ | |||
+ | |||
+ | [tasks] | ||
+ | . my_first_celery.add | ||
+ | |||
+ | [2020-05-31 11:17:26,645: INFO/MainProcess] Connected to redis://127.0.0.1:6379/0 | ||
+ | [2020-05-31 11:17:26,650: INFO/MainProcess] mingle: searching for neighbors | ||
+ | [2020-05-31 11:17:27,665: INFO/MainProcess] mingle: all alone | ||
+ | [2020-05-31 11:17:27,677: INFO/MainProcess] celery@localhost.localdomain ready. | ||
+ | </nowiki> |
2020年5月31日 (日) 03:34的版本
Redis配置和启动
我们以Redis为例,首先修改Redis配置文件redis.conf,修改bind = 127.0.0.0.1为bind =0.0.0.0,意思是允许远程访问Redis数据库。
redis-4.0.11/redis.conf
bind 0.0.0.0
接下来启动Redis
cd src
./redis-server ../redis.conf
[root@localhost src]# ps -ef |grep redis
root 84370 80953 0 12:07 pts/2 00:00:00 ./redis-server 0.0.0.0:6379 root 84388 84206 0 12:11 pts/3 00:00:00 grep --color=auto redis
python配置redis模块
[root@localhost op]# pip3 install redis
[root@localhost op]# python3
Python 3.7.5 (default, May 8 2020, 10:08:52) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import redis >>> r = redis.Redis(host='localhost',port=6379,db=0) >>> r.set('foo','bar') True >>> r.get('foo') b'bar' >>> exit()
第一个Celery程序
#encoding=utf-8 from celery import Celery import time import socket app = Celery('tasks', broker='redis://127.0.0.1:6379/0',backend ='redis://127.0.0.1:6379/0' ) def get_host_ip(): """ 查询本机ip地址 :return: ip """ try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() return ip @app.task def add(x, y): time.sleep(3) # 模拟耗时操作 s = x + y print("主机IP {}: x + y = {}".format(get_host_ip(),s)) return s
代码说明:第7行指定了中间人broker为本机的Redis数据库0,结果后端同样使用Redis;第9~20行定义了一个获取本机IP地址的函数,为后序分布式队列做铺垫;第23行到最后定义了一个模拟虚耗时的任务函数,使用app.task来装饰。
运行这个python程序,
celery -A my_first_celery worker --loglevel=info
/usr/local/Python3/lib/python3.7/site-packages/celery/platforms.py:801: RuntimeWarning: You're running the worker with superuser privileges: this is absolutely not recommended! Please specify a different user using the --uid option. User information: uid=0 euid=0 gid=0 egid=0 uid=uid, euid=euid, gid=gid, egid=egid, -------------- celery@localhost.localdomain v4.4.2 (cliffs) --- ***** ----- -- ******* ---- Linux-3.10.0-1062.el7.x86_64-x86_64-with-centos-7.7.1908-Core 2020-05-31 11:17:26 - *** --- * --- - ** ---------- [config] - ** ---------- .> app: tasks:0x7f920e95a1d0 - ** ---------- .> transport: redis://127.0.0.1:6379/0 - ** ---------- .> results: redis://127.0.0.1:6379/0 - *** --- * --- .> concurrency: 2 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . my_first_celery.add [2020-05-31 11:17:26,645: INFO/MainProcess] Connected to redis://127.0.0.1:6379/0 [2020-05-31 11:17:26,650: INFO/MainProcess] mingle: searching for neighbors [2020-05-31 11:17:27,665: INFO/MainProcess] mingle: all alone [2020-05-31 11:17:27,677: INFO/MainProcess] celery@localhost.localdomain ready.