新建tasks.py
import time
from celery import Celery
celery = Celery('tasks', broker='redis://127.0.0.1:6379/0')
@celery.task
def sendmail(mail):
print(mail)
print('sending mail to %s...' % mail['to'])
time.sleep(2.0)
print('mail sent.')
if __name__ == '__main__':
pass
celery -A tasks worker --loglevel=info
新建发送邮件模块
from tasks import sendmail
sendmail.delay(dict(to='123@qq.com'))
sendmail.delay(dict(to='456@qq.com'))
sendmail.delay(dict(to='789@qq.com'))
if __name__ == '__main__':
pass
运行
终端报错
[tasks]
. tasks.sendmail
[2021-07-21 14:46:11,308: INFO/MainProcess] Connected to redis://127.0.0.1:6379/0
[2021-07-21 14:46:11,355: INFO/MainProcess] mingle: searching for neighbors
[2021-07-21 14:46:12,488: INFO/MainProcess] mingle: all alone
[2021-07-21 14:46:12,654: INFO/MainProcess] celery@pcw ready.
[2021-07-21 14:46:14,855: INFO/SpawnPoolWorker-1] child process 28608 calling self.run()
[2021-07-21 14:46:14,913: INFO/SpawnPoolWorker-2] child process 22836 calling self.run()
[2021-07-21 14:46:14,950: INFO/SpawnPoolWorker-3] child process 34684 calling self.run()
[2021-07-21 14:46:15,109: INFO/SpawnPoolWorker-5] child process 34412 calling self.run()
[2021-07-21 14:46:15,382: INFO/SpawnPoolWorker-6] child process 18312 calling self.run()
[2021-07-21 14:46:15,489: INFO/SpawnPoolWorker-4] child process 24356 calling self.run()
[2021-07-21 14:46:15,744: INFO/SpawnPoolWorker-7] child process 30688 calling self.run()
[2021-07-21 14:46:15,839: INFO/SpawnPoolWorker-8] child process 27720 calling self.run()
[2021-07-21 14:46:49,094: INFO/MainProcess] Received task: tasks.sendmail[1f06b716-85e8-40b4-95a8-3df111eaea65]
[2021-07-21 14:46:49,098: INFO/MainProcess] Received task: tasks.sendmail[35c9621d-2071-4dd1-a169-0f45c80fec50]
[2021-07-21 14:46:49,104: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')
Traceback (most recent call last):
File "c:\program files\python37\lib\site-packages\billiard\pool.py", line 362, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:\program files\python37\lib\site-packages\celery\app\trace.py", line 544, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
[2021-07-21 14:46:49,105: INFO/MainProcess] Received task: tasks.sendmail[43924b24-e7d7-4b55-b5ab-fcbd9875341f]
[2021-07-21 14:46:49,112: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')
Traceback (most recent call last):
File "c:\program files\python37\lib\site-packages\billiard\pool.py", line 362, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:\program files\python37\lib\site-packages\celery\app\trace.py", line 544, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
[2021-07-21 14:46:49,120: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')
Traceback (most recent call last):
File "c:\program files\python37\lib\site-packages\billiard\pool.py", line 362, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:\program files\python37\lib\site-packages\celery\app\trace.py", line 544, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
解决方法
pip install eventlet
在启动celery命令增加参数 -p eventlet
celery -A tasks worker --loglevel=info -P eventlet