Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: python multiprocessing  (Прочитано 2629 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
python multiprocessing
« : 31 Октября 2011, 19:08:11 »
def work(q):
f.write()
f = file("data.csv","w")
for p in range(10):
p = Process(target=work, args=[q])
p.start()
p.join()
f.close()
Проблема в том, что в полученном датафайле, есть искажения, похожие на то, будто один процесс закончить запись не успел, вклинился другой. Вопрос, как это устранить?
Или другой путь, писать не в файл сразу, а сначала в переменную глобальную или какой-то класс типа очередь, чтоб исключить возможность наложений данных.

Пользователь решил продолжить мысль 01 Ноября 2011, 03:27:21:
ну что питонщиков нет?
« Последнее редактирование: 01 Ноября 2011, 03:27:21 от ⚡ Thunde® ⚡ »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: python multiprocessing
« Ответ #1 : 01 Ноября 2011, 08:29:20 »
Проблема в том, что в полученном датафайле, есть искажения, похожие на то, будто один процесс закончить запись не успел, вклинился другой.
Правильно, так и должно быть.
Вопрос, как это устранить?
Семафоры Вам помогут.
Или другой путь, писать не в файл сразу, а сначала в переменную глобальную или какой-то класс типа очередь, чтоб исключить возможность наложений данных.
Это несколько лучше, но без семафоров наложение все равно возможно.
ну что питонщиков нет?
Ваша проблема не имеет отношения к питону.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: python multiprocessing
« Ответ #2 : 01 Ноября 2011, 10:55:47 »
Вопрос к питонщикам, потому как я ищу решение проблемы при работе на питоне.
Можешь кинуть ссылку на пример работы с регулировщиками?

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля

Оффлайн ende_neu

  • Старожил
  • *
  • Сообщений: 2473
    • Просмотр профиля
Re: python multiprocessing
« Ответ #4 : 01 Ноября 2011, 19:01:37 »
Дык, файл закрывать надо не где-то в конце, а после записи процессом(ну и открывать в них соответственно
Код: (python) [Выделить]
def work(q):
    with open("data.csv","w") as f:
        f.write(q)
, и use очередь multiprocessing.Queue
« Последнее редактирование: 01 Ноября 2011, 19:03:49 от ende_neu »

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: python multiprocessing
« Ответ #5 : 02 Ноября 2011, 03:49:38 »
Я использовал очередь для постановки задач. Т.е. есть много задач, они ставятся в очередь, потом куча процессов выхватывают задачи для исполнения в этой очереди.

Т.е., чтобы не было коллизий при записи мне надо открывать файл на запись в каждом процессе отдельно. Получается, что возник ситуации очереди при записи на уровне ФС. Т.е. в файл пишет один процесс, блокирует доступ на запись другим, другие в это время ждут. Система нормально отработает большую очередь за право доступа к файлу? т.е. не получится так, что очередь не будет соблюдаться, т.е. не будет ли некоторые процессы ждать слишком долго, в то время как другие поступившее позже, будут пробиваться раньше? Думаю нет, просто не знаю точно.

Или, мб правильно сделать 2-ю очередь куда будут помещаться результаты работы процессов, а потом уже её записать в файл одним процессом?
Так я уже кстати попробовал, но с наскоку не вышло...

Какой путь вернее, подскажите (м/у очереди на доступ к файлу и предварительной записи в объект класса очередь).

Пользователь решил продолжить мысль 02 Ноября 2011, 04:02:11:
Там по ссылке, кстати пример с потоками (хотя в моём случае это не важно), возник вопрос, что же лучше и где использовать потоки или процессы. Я раньше читал по этому вопросу, пришёл к выводу, что мне обычно процессы удобнее. Вроде как главное преимущество потоков, экономия ресурсов?
« Последнее редактирование: 02 Ноября 2011, 04:02:11 от ⚡ Thunde® ⚡ »

Оффлайн ende_neu

  • Старожил
  • *
  • Сообщений: 2473
    • Просмотр профиля
Re: python multiprocessing
« Ответ #6 : 02 Ноября 2011, 19:41:14 »
>что же лучше и где использовать потоки или процессы.

Multiprocessing обёртка для Threading (+Queue, Pickle и т.п.)
Просто готовые классы/методы.Конечно, если писать свои под конкретную задачу можно сэкономить, но на фоне обшей прожорливости питона это несущественно, да и выйдет ли написать лучше.По приоритетам/требованиям задачи смотреть надо.

Касательно же вопроса - вобще писать в файл не то действие, которое требуется разделять на потоки, откуда там задержки.В получении, обработке же а не в писании.Вот результаты складывать в Queue, из Queue уже и писать.
Основы работы с ним http://www.doughellmann.com/PyMOTW/Queue/ (это обычный Queue но в multiprocessing.Queue тоже самое(почти, но не всё))
Насчёт порядка - authkey есть у процессов, есть менеджеры/пулы для руления ими(процессами), читайте http://docs.python.org/library/multiprocessing.html# , и задачу изложите более подробно если что не получается.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: python multiprocessing
« Ответ #7 : 03 Ноября 2011, 03:18:58 »
вообще это парсер инет-магазина, я вырезал лишний код, чтоб не загромождать, а показать суть проблемы, соот. задержки пока ответит сервер очень большие и рост от числа процессов линейный до определённых пределов.

спасибо за ссылки с траблой разберусь, как время появится свободное.

Оффлайн blindvic

  • Участник
  • *
  • Сообщений: 179
    • Просмотр профиля
Re: python multiprocessing
« Ответ #8 : 18 Декабря 2011, 01:10:02 »
вообще это парсер инет-магазина,
В смысле, дергаешь инфу с сайта? Вот хорошая штука для таких вещей: http://scrapy.org/

 

Страница сгенерирована за 0.029 секунд. Запросов: 25.