2016-07-29 2 views
1

Я довольно новичок программист, и я впервые ставил свою руку на многопроцессорную обработку. После того, как я столкнулся с обычными ошибками травления, я искал здесь и обнаружил, что Пафос, вероятно, лучше всего использовать.Многопроцессорность, имеющая проблемы

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

вызов исходной функции выглядит следующим образом:

devices = sq.sqlOperation("SELECT * from Devices") 
    for device in devices: 
      pullNewData(device) 

Короче говоря, SQL-запрос дает мне список словарей, кормлю pullNewData() словарь для каждой записи, он идет, соединяет, тянет все через и обновляет базу данных.

Я предпочел бы не переписать несколько тысяч строк кода, так что я надеюсь, что адаптация будет легко: Все из следующих примеров имеем:

from pathos.multiprocessing import ProcessingPool as Pool 

На вершине. Я пробовал:

devices = sq.sqlOperation("SELECT * from Devices") 
    p = Pool(4) 
    p.apipe(pullNewData, devices) 

Который молча потерпел неудачу, даже с Try/за исключением вокруг него

devices = sq.sqlOperation("SELECT * from Devices") 
    p = Pool(4) 
    p.map(pullNewData, devices) 

То же, бесшумный неудачу:

Однако:

devices = sq.sqlOperation("SELECT * from Devices") 
    p = Pool(4) 
    for data in devices: 
     p.apipe(pullNewData(data)) 

работал но просто проходили каждый поочередно.

В моем отчаянии я даже пытался положить его внутри списка понимания (что, да, это ужасно некрасиво, но в тот момент я бы сделал что-нибудь)

devices = sq.sqlOperation("SELECT * from Devices") 
    p = Pool(4) 
    [ p.apipe(pullNewData(data)) for data in devices ] 

Итак, как бы я это сделать ? Как я могу запустить его для каждой новой записи параллельно?

+1

Вы пробовали 'Pool (1)'?(чтобы проверить, не является ли проблема с тем, как вы используете пафос или если это проблема синхронизации в вашем коде) – thebjorn

+0

Хорошо, после некоторых попыток, которые, похоже, уволили их в унисон сейчас, но я столкнулся с другой проблемой где соединение парамико не работает. Хммм ... –

+0

Короче говоря, спасибо, вот и все. После исправления некоторых проблем с моим кодом, мы в сети! –

ответ

1

Так что попробовав Pool(1), я показал, какие проблемы у него возникли. Я звала другие функции внутри как этот файл и другие файлы, которые, благодаря функции будучи совершенно новый процесс не имел ни малейшего представления о том, так что мне пришлось поставить операторы импорта для обоих других модулей и выдает

from thisModule import thisFunction 

для других функций в том же файле. Тогда после этого я поднял бассейн и работал отлично с помощью:

devices = sq.sqlOperation("SELECT * from Devices") 
p = Pool(4) 
p.map(pullNewData, devices) 

Спасибо, это было очень полезно и очень полезным опытом для меня.

Он не веял мне, что новый процесс не будет знать о операторах импорта в файле, в котором находилась функция, или о других функциях. Ну что ж. Большое спасибо thebjorn за то, что он указал мне в правильном направлении.

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