Найти - Пользователи
Полная версия: Как пользоваться Multiprocessing
Начало » Python для новичков » Как пользоваться Multiprocessing
1
kt368
Здравствуйте!
Хочу попробовать поработать с процессами при помощи модуля 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!”, процессы при этом тоже плодятся аж до зависания системы.
Что я делаю не так?
GaiveR
Попробуйте-ка так:

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()
kt368
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(), все работало…
Как такое можно подебажить? Где у меня может быть ошибка?
Заранее спасибо.
GaiveR
kt368
А почему так заработало, а по-старому не работало?
Иногда полезно читать документацию (“Safe importing of main module”) :)

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

kt368
Вообщем, прикручиваю этот Multiprocessing, теперь такое непонятно:
Покажите больше кода
kt368
Разобрался! Вышеприведённая ошибка происходила из-за того, что я в одном процессе (в основном) коннектился к базе данных, а в дочернем - пытался что-то выполнить в этой базе. Т.е. в основном было
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)
Если кому-то интересно - могу выложить получившийся маленький проектик…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB