Модуль не найден при запуске scrapy в сельдерее

#python #scrapy #multiprocessing #celery

Вопрос:

РЕДАКТИРОВАТЬ: Я узнал, что это произошло только на компьютере с Windows. На сервере Linux все работает нормально.

Я запускаю очистной сканер в процессе сельдерея и продолжаю получать эту ошибку. Есть идеи, что я делаю не так?

 [2021-08-18 11:28:42,294: INFO/MainProcess] Connected to sqla sqlite:///celerydb.sqlite
[2021-08-18 11:28:42,313: INFO/MainProcess] celery@NP45086 ready.    
[2021-08-18 09:46:58,330: INFO/MainProcess] Received task: app_celery.scraping_process_cli[e94dc192-e10e-4921-ad0c-bb932be9b568]
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:Program FilesPython374libmultiprocessingspawn.py", line 105, in spawn_main
        exitcode = _main(fd)
      File "C:Program FilesPython374libmultiprocessingspawn.py", line 115, in _main
        self = reduction.pickle.load(from_parent)
    ModuleNotFoundError: No module named 'app_celery'
    [2021-08-18 09:46:58,773: INFO/MainProcess] Task app_celery.scraping_process_cli[e94dc192-e10e-4921-ad0c-bb932be9b568] succeeded in 0.4380000000091968s: None
 

Мой app_celery выглядит так:

 app = Celery('app_celery', backend=..., broker=...)

def scrape_data():
    process = CrawlerProcess(get_project_settings())
    crawler = process.create_crawler(spider_cls)
    process.crawl(spider_cls, **kwargs)
    process.start()

@app.task(name='app_celery.scraping_process_cli', time_limit=1200, max_retries=3)
def scraping_process_cli(company_id):
    import multiprocessing
    a = multiprocessing.Process(target=scrape_data())
    a.start()
    a.join()
 

Я управляю сельдереем как:

 celery -A app_celery worker -c 4 -n worker1 --pool threads
 

Комментарии:

1. Сельдерей предшествовал многопроцессорной обработке. У них есть свой собственный пакет управления процессами под названием billiard, который вы должны использовать, когда вам нужно создать процессы для примера. Ссылка на проект: github.com/celery/billiard . Для протокола, я не говорю, что это причина ошибки ModuleNotFoundError . Обычно это происходит, когда ваш PYTHONPATH неверен.

Ответ №1:

  1. Прежде чем выполнить шаг 2, измените каталог на корневой каталог проекта вашего проекта scrapy.
  2. Вы должны сказать CrawlerProcess() , чтобы загрузить settings.py .
 import os

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


def scrape_data():
    os.chdir("/path/to/your/scrapy/project_root")
    process = CrawlerProcess(get_project_settings())
    process.crawl('spider_name')
    process.start()
 

Комментарии:

1. Я забыл настройки в своем вопросе. В любом случае, я попытался изменить каталог, как вы написали, и все равно получаю ту же ошибку.

2. @iam.mattevans Как вы запустили команду celery -A app_celery . Вы снимались в фильме «Где сейчас»? app_celery Кажется, проблема в том, что не удается запустить приложение сельдерей, но не внутреннее приложение для вырезки.

3. Я запускаю его из того же каталога. Сельдерей запускается нормально, он даже регистрирует, что получил задание, поэтому сельдерей должен работать нормально. Когда вместо multiprocessing.Process(target=scrape_data()) того , чтобы я писал multiprocessing.Process(target=print("hello") , все идет прекрасно.