Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 17, 2013 20:34:14

kt368
От:
Зарегистрирован: 2012-01-08
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как пользоваться Multiprocessing

Здравствуйте!
Хочу попробовать поработать с процессами при помощи модуля Multiprocessing.
Есть такой скрипт:

from multiprocessing import Process
from time import sleep
def f1():
    sleep(5)
    print('Done!')
p=Process(target=f1,args=())
p.start()
sleep(2)
print('Hello, world!')
p.join()
Нужно ли использовать метод p.join() для того чтобы при запуске этого скрипта он ждал две секунды, вывел Hello, World!, ждал ещё три секунды и выводил Done?
Вычитал здесь, что если не применять метод p.join(), то Windows XP начинает плодить процессы один за другим и зацикливается насовсем. Я пробовал запускать этот скрипт и с p.join(), и без него - все равно плодятся процессы pythonw.exe, спасает только перезагрузка. Да, если запускать из python IDLE, то никаких “Done” не выводится, а если просто запуском скрипта из far-a - то выводится вперемешку “Done” и “Hello, world!”, процессы при этом тоже плодятся аж до зависания системы.
Что я делаю не так?



Офлайн

#2 Фев. 17, 2013 21:23:57

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Как пользоваться Multiprocessing

Попробуйте-ка так:

from multiprocessing import Process
from time import sleep
def f1():
    sleep(5)
    print('Done!')
def main():
    p=Process(target=f1,args=())
    p.start()
    sleep(2)
    print('Hello, world!')
    p.join()
if __name__ == '__main__':
    main()



Отредактировано GaiveR (Фев. 17, 2013 21:24:10)

Офлайн

#3 Фев. 17, 2013 22:03:14

kt368
От:
Зарегистрирован: 2012-01-08
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как пользоваться Multiprocessing

GaiveR
Попробуйте-ка так:
Да, процессы не плодятся :), в результате получаю
>>> 
Hello, world!
>>> 
А почему так заработало, а по-старому не работало? И почему не выводится ‘Done!’?

Вообщем, прикручиваю этот Multiprocessing, теперь такое непонятно:
В классе file_processor есть метод process(self,filename). При вызове самого этого метода он работает правильно:
fp1 = file_processor.file_processor()
fp1.process(path)
А при вызове этого метода, обернутого в процесс я получаю сообщение об ошибке:
fp1 = file_processor.file_processor()
p=Process(target=pp,args=(fp1,path_temp_replace+file_name,))
p.start()
EOFError
Exception AttributeError: "'Cursor' object has no attribute 'connection'" in <bound method Cursor.__del__ of <MySQLdb.cursors.Cursor object at 0x00BF6410>> ignored
В методе считывается информация из файла, обрабатывается, и заносится в таблицу БД MySQL.

Пробовал для упрощения создать простейший класс с одним методом и выполнить его через Multiprocessing и start(), все работало…
Как такое можно подебажить? Где у меня может быть ошибка?
Заранее спасибо.



Отредактировано kt368 (Фев. 18, 2013 00:20:01)

Офлайн

#4 Фев. 18, 2013 19:06:44

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Как пользоваться Multiprocessing

kt368
А почему так заработало, а по-старому не работало?
Иногда полезно читать документацию (“Safe importing of main module”) :)

kt368
И почему не выводится ‘Done!’?
У меня выводится.

kt368
Вообщем, прикручиваю этот Multiprocessing, теперь такое непонятно:
Покажите больше кода



Офлайн

#5 Фев. 19, 2013 12:55:04

kt368
От:
Зарегистрирован: 2012-01-08
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как пользоваться Multiprocessing

Разобрался! Вышеприведённая ошибка происходила из-за того, что я в одном процессе (в основном) коннектился к базе данных, а в дочернем - пытался что-то выполнить в этой базе. Т.е. в основном было

self.con = MySQLdb.connect(host="localhost", user="root", passwd="251088", db="mca", charset='utf8')
self.cur = self.con.cursor()
А в дочернем процессе:
exec_str = 'INSERT INTO ...;'
self.cur.execute(exec_str)
Если кому-то интересно - могу выложить получившийся маленький проектик…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version