Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-05-13

processing MPC lib

Дарю годный сниппет использования библиотеки processing в Python под MS Windows.

Для реализации моей очередной идеи, связанной с сокращением ручного труда, какабычно, понадобился мне инструмент контроля нескольких одновременно работающих процессов в MS Windows. Суть в том, что мне надо стартовать некоторое количество процессов, дождаться пока все завершат работу, после этого запустить следующий этап обработки данных. После целых пяти минут работы соображалкой «что у нас есть в винде под такую задачу» я понял, что делать «супервизор» буду на Python. Ибо для него есть прекрасная библиотека processing.

Библиотека замечательная, популярная, хорошо документированная. Но (куда же без «но») опять же, какабычно, имеющиеся в документации примеры не захотели работать в моих условиях. Условия просты — ждать завершения всех процессов (значит берем Pool), аккуратно выводить принтуемые сообщения из подпрограммы (значит берем Lock).

Вроде должно работать, но не работает. Не буду приводить свои промежуточные попытки добиться желаемого, приведу хороший, годный вариант:
def mpcWorker(tup):
    lock, params = tup
    lock.acquire()
    print 'mpcWorker, params = "%s"' % params
    lock.release()

    cmdl = ['cmd.exe', '/c', params]
    import subprocess
    subprocess.call(cmdl)
    res = 'done mpcWorker, params = "%s"' % params

    lock.acquire()
    print res
    lock.release()
    return res

def mprocessing():
    ''' Don't mix prints, get results back '''
    from processing import Process, Pool, Manager
    man = Manager()
    lock = man.Lock()
    pool = Pool(processes=2)
    tasks = [(lock, 'ping -n 5 localhost'), (lock, 'ping -n 3 ya.ru')]
    print 'Pool.map result = "%s"' % pool.map(mpcWorker, tasks)
    pool.close()
    pool.join()
Справедливости ради замечу, что никакой рокетсаенс тут нет. Рецепт смикширован из нескольких легко нагугливаемых форумных постов. В качестве бонуса применения именно map() имеем список возвращаемых воркерами значений, удобно.

Секретов, не отраженных в примерах документации, тут два. Один — Lock надо брать из Manager-а. Другой — пул надо close() и потом join(). Обязательно.

Если выкинуть ненужное, весь супервизор умещается в 10 строк. Обожаю питон.

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)