5

Я начинаю набросать структуру сайта информационной службы количественного финансирования, написанного на Python (надеюсь, что на 3.x), и пришел к выводу - исправьте меня, если я ' неверно - мне придется использовать как сетевую библиотеку eventlet , так и многопроцессорную библиотеку.вопросы многопоточности и многопроцессорности для квантового сайта

Одна часть системы - это в основном задача cron, которая работает в фоновом режиме, изучая фондовый рынок и другие финансовые данные после закрытия рынка, выполняет машинное обучение и вычисления квантов, затем ставит прогнозы в простой базе данных или, возможно, даже плоский файл с разделителями-запятыми. (Аргументы, таким образом, передаются между разделами системы через файл.)

Я понимаю, что этот флажок может использоваться для неблокирующего ввода-вывода, так что красивый суп или scrapy может удалять веб-страницы с нескольких сайтов одновременно (), а библиотека многопроцессорности может позволить алгоритмам машинного обучения/кванта выполнять вычисления по всем данным запаса параллельно в виде отдельных процессов.

Для просмотра прогнозов пользователи будут подключаться к другой части системы, созданной с помощью Flask, которая будет обращаться к базе данных и отображать прогнозы.

Я предполагаю, что все эти библиотеки и смешанные потоки/процедуры многопроцессорности ладят друг с другом? Я собираюсь использовать pythonanywhere.com в качестве хоста, и у них, похоже, есть несколько «батарей». Конечно, когда тестирование будет завершено, мне, вероятно, придется обновить число «рабочих», чтобы задействовать окончательно развернутый сайт.

Любые подводные камни в смешении нитей и многопроцессорности во что-то таком сложном?

+0

Не могу ответить на ваш вопрос окончательно, как я не пытался, что именно, но в целом это нормально, чтобы иметь несколько нитей и несколько процессов. – 101

+0

Я не уверен, насколько тесно * gevent * связан с * eventlet *, но для поддержки многопроцессорности из * gevent *, когда потоки обезглавлены, мне пришлось использовать модуль * subprocess * для связи и * pickle * для поскольку многопроцессорность не поддерживается * gevent *. – cpburnz

+0

PythonAnywhere dev здесь. Одна из вещей, которые вам нужно знать о том, чтобы делать это в PythonAnywhere, - это то, что мы ограничиваем потоки и процессы, которые могут запускаться пользователями, поэтому вам, вероятно, потребуется использовать пул потоков/процессов. Я считаю, что многопроцессорность имеет встроенный. – Glenn

ответ

2

Просто некоторые общие мысли, которые не могли поместиться в разделе комментариев:

  1. SCRAPY уже есть некоторые способы обработки concurrent сетевых запросов через витую. Это означает, что вам может не понадобиться использовать eventlet? Конечно, это зависит от того, как именно вы делаете скребок/что именно вам нужно очистить. Из того, что я давно пробовал (может быть, я совершенно не прав), если вы говорите, что нужен селен, чтобы очистить ответы на javascript, тогда это сложно сделать одновременно с помощью scrapy. Но если вы просто выполняете запросы с urllib или что-то (например: для API), то я думаю, что достаточно просто провести сеанс.

  2. Я согласен с вашим комментарием - часть веб-соскабливания всегда будет очень неудачной, поэтому вы определенно хотите отделить выскабливание против прогностических частей. Вам необходимо учесть несостоявшиеся скресты (например: что, если сайт не работает, или что, если вы получаете ошибочные данные), и очистите все данные, прежде чем набивать очищенные данные в свою собственную базу данных, а затем (отдельно) запустить машинное обучение материала по этим данным.

Но одна важная вещь здесь является то, что вы, безусловно, нужна база данных между выскабливание и машинного обучения (не может просто передать их в памяти или через CSV-файл, как вы предложили). Бесчисленные причины, пара являются:

  • сэкономить на потертости (не нужно будет загрузить несколько дней данных каждый раз, как раз самый последний день)
  • дать вам резервное копирование и исторические данные в случае, если ваш веб царапины больше не доступны (например: скажем, вы очищаете последние 365 дней - что, если ваш источник информации дает вам только последние 365 дней, но вы вдруг хотите 700 дней?Вы хотите сохранить данные из ваших предыдущих скрепок где-нибудь)
  • быть намного быстрее/лучше/меньше flakey - с правильно проиндексированным db, вероятно, будет столь же важным, если не более важным, чем любая параллельная обработка вашего машинного обучения алгоритм.

Также кстати Джанго Works really well с Scrapy ...

Смежные вопросы