27

Trying to run simple example with Celery and receiving an exception. RabbitMQ started in a Docker, also tried to start it locally. Celery works on a local Windows host

from celery import Celery

app = Celery('tasks', broker='amqp://192.168.99.100:32774')

@app.task()
def hello():
    print('hello')


if __name__ == '__main__':
    hello.delay()

Excerpt of my error text:

[2017-08-18 00:01:08,632: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)',)
Traceback (most recent call last):                                              
    File "c:\users\user\celenv\lib\site-packages\billiard\pool.py", line 358, in workloop                        
        result = (True, prepare_result(fun(*args, **kwargs)))                                  
    File "c:\users\user\celenv\lib\site-packages\celery\app\trace.py", line 525, in _fast_trace_task
        tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
Faizan Amin
  • 398
  • 5
  • 16
Igor Nikolaev
  • 303
  • 1
  • 3
  • 8

6 Answers6

94

Celery 4.0+ does not officially support Windows yet. But it still works on Windows for some development/test purposes.

Use eventlet instead as below:

pip install eventlet
celery -A <module> worker -l info -P eventlet

It works for me on Windows 10 + celery 4.1 + python 3.

===== update 2018-11 =====

Eventlet has an issue on subprocess.CalledProcessError:

https://github.com/celery/celery/issues/4063

https://github.com/eventlet/eventlet/issues/357

https://github.com/eventlet/eventlet/issues/413

So try gevent instead.

pip install gevent
celery -A <module> worker -l info -P gevent

This works for me on Windows 10 + celery 4.2 + python 3.6

pushrbx
  • 312
  • 2
  • 9
Samuel Chen
  • 2,124
  • 14
  • 9
  • I tried running with `-l info -c 5 gevent` flags and got `unrecognized arguments: gevent`. It however works with `-l info -P gevent`. How can I fix this? – Azima May 09 '20 at 07:59
18

It worked for me:

celery -A my_project_name worker --pool=solo -l info

basically things become single threaded and are suppoted

nofoobar
  • 2,826
  • 20
  • 24
17

I got this error on Windows 7 32bit system. So I did this to make it work.

Add this

`os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')` 

before defining a celery instance in myproj/settings.py file in your django project.

It should like like

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproj.settings')
os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')

app = Celery('tasks', broker='redis://127.0.0.1:6379/0')

I am using redis as a messaging broker so defined broker='redis://127.0.0.1:6379/0'

Lawrence Gandhar
  • 718
  • 8
  • 12
  • Thanks, this worked for me. Would have spent hours (on top of the ones already spent). I was just trying the example from docs.celeryproject.org: import os os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1') app = Celery('tasks', broker='amqp://guest@localhost//') etc – Coffee and Code Mar 01 '20 at 14:16
12

For Celery 4.1 on Windows.

Set an environment variable FORKED_BY_MULTIPROCESSING=1. Then you can simply run celery -A <celery module> worker.

Bob Jordan
  • 3,049
  • 2
  • 34
  • 41
7

Which celery version? As far as I remember celery isn't supported in windows since celery 4

svarog
  • 9,477
  • 4
  • 61
  • 77
ItayB
  • 10,377
  • 9
  • 50
  • 77
0

run this command

celery -A name_of_project worker --pool=solo -l info