#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:
- Прежде чем выполнить шаг 2, измените каталог на корневой каталог проекта вашего проекта scrapy.
- Вы должны сказать
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")
, все идет прекрасно.