webBG - програмисти, машинно обучение, javascript, python, php, питам, говорим, публикации

python-twisted: разклонение за фонова обработка без връщане

Как правилно да разклоните дъщерен процес в twisted, който не използва нищо от twisted (но използва данни от родителския процес) (напр. да обработите „моментна снимка“ на някои данни от родителския процес и да ги запишете във файл, без блокиране)?

Изглежда, че ако направя нещо като чисто изключване в дъщерния процес след os.fork(), това затваря някои от гнездата/дескрипторите в родителския процес; единственият начин да се избегне това, което виждам, е да се направи os.kill(os.getpid(), signal.SIGKILL), което наистина изглежда като лоша идея (въпреки че не е пряко проблематично).

(освен това, ако dict се промени в родителския процес, може ли да се промени и в дъщерния процес? Бързият тест обаче показва, че не се променя. ОС/ядрата са стабилни за debian / sid)

01.11.2012

  • (Донякъде подозирам, че един от os.exec* с нещо като обвивка, която не прави нищо, би решил това) 01.11.2012
  • Можете ли да поясните какво имате предвид под използва данни от родителския процес? Спецификата на данните, с които искате да работите, вероятно ще има голямо значение за най-добрия отговор на този въпрос. 02.11.2012

Отговори:


1

IReactorProcess.spawnProcess (обикновено се предлага като from twisted.internet import reactor; reactor.spawnProcess) може да създаде процес, изпълняващ всеки наличен изпълним файл на вашата система. Подпроцесът не трябва да използва Twisted или дори да бъде в Python.

Не се обаждайте на os.fork сами. Както открихте, той има много много странни взаимодействия със състоянието на процеса, които spawnProcess ще управлява вместо вас.

Сред проблемите с os.fork са:

  • Разклоняването копира текущото ви състояние на процеса, но не копира състоянието на нишките. Това означава, че всяка нишка в средата на модифицирането на някакво глобално състояние ще остави нещата наполовина счупени, вероятно ще задържи някои ключалки, които никога няма да бъдат освободени. Не стартирайте нишки във вашето приложение? Проверили ли сте всяка библиотека, която използвате, всяка нейна зависимост, за да се уверите, че никоя от тях никога не е използвала или ще някога да използва фонова нишка за нещо?
  • Може да си помислите, че докосвате само определени области от паметта на вашето приложение, но благодарение на броенето на препратки на Python, всеки обект, който дори периферно гледате (или присъства в стека), може да има преброяване на препратки, което се увеличава или намалява. Увеличаването или намаляването на refcount е операция за запис, което означава, че цялата страница (не само този един обект) се копира обратно във вашия процес. Така че разклонените процеси в Python са склонни да натрупват много по-голям копиран набор от, да речем, разклонените C програми.
  • Много библиотеки, известни с всички библиотеки, които създават системите на macOS и iOS, не могат да обработват fork() правилно и просто ще сринат програмата ви, ако се опитате да ги използвате след fork, но преди exec.
  • Има флаг за казване на файловите дескриптори да се затварят на exec - но няма такъв флаг, който да ги затвори на fork. Така че всички файлове (включително регистрационни файлове и отново всякакви фонови временни файлове, отворени от библиотеки, за които може дори да не подозирате) могат да бъдат тихо повредени или съкратени, ако не управлявате внимателно достъпа до тях.
01.11.2012
  • Както отбелязах, имам нужда от достъп до данните в родителския процес (дори до моментната снимка на данните. Което изглежда е точно това, което fork() предоставя). Което означава, че създаването на процес от изпълним файл не е полезно тук. 02.11.2012
  • Но достъп до какви данни? Както се оказа, os.fork във всяка програма на Python почти сигурно е повреден (по дизайн). Единственото изключение може да бъде, ако незабавно извикате os.execve (или една от подобни функции) - което изхвърля всичките ви данни, точно както прави spawnProcess. Така че ще помогне, ако промените въпроса си от Как мога да използвам os.fork? до Как мога да споделя данни под формата на X с друг процес? или може би дори просто отидете до Как мога да запазя данни под формата на X в програма, използваща Twisted? 02.11.2012
  • Като цяло нямам никакви проблеми с поддържането му. Интересувам се да се опитам да го направя атомен по повече начини. И не, изобщо не ми изглежда, че os.fork е счупен. Работи доста добре в много случаи (а също и в целия multiprocessing) и може да се използва за обработка, например, на големи масиви numpy с код на Python на множество ядра, без да ги дублира в паметта. И може да се използва по OP начин доста добре, но се опитвам да разбера как да направя това по-добре. 02.11.2012
  • @HoverHell, той всъщност е повреден по редица изненадващи начини. Ако това, което искате да направите, е да споделите голям numpy масив между процесите, помислете за използването на numpy.memmap docs.scipy.org/doc/numpy/reference/generated/ 07.11.2012
  • @Glyph, някакви препратки за това как е счупен? 12.11.2012
  • Това не е отговор. OP иска разумно да използва API на операционната система за много ефективно и просто създаване на моментна снимка на паметта. Как се счупва вилицата на python? 18.06.2019
  • @yaccz Едно изчерпателно обяснение на всички начини, по които fork() може да се обърка, вероятно е семестриален колежански курс от 300 нива по операционни системи, но аз добавих кратко резюме на някои от проблемите към отговорете така, че това да не е просто сляп аргумент от авторитета. 21.06.2019
  • Нови материали

    10 умопомрачителни C# хакове
    Здравейте! Като страстен разработчик на C#, аз винаги съм търсил начини да подобря уменията си за кодиране. Вълнувам се да споделя с вас някои умопомрачителни хакове и прозрения, които ми..

    Electron с база данни Sqlite3
    Electron е рамка за изграждане на междуплатформени настолни приложения с HTML, CSS JavaScript. Electron е написан на C++, Javascript, Objective C, Python и т.н. Днес Electron е супер готин и..

    Системи за препоръчване в машинното обучение
    Какво представляват двигателите за препоръки? Това е най-мощното и полезно приложение на технологията за машинно обучение в бизнеса. Тези дни. Днес всеки голям гигант като Google, Amazon,..

    Топ 5 Python IDE / текстови редактори
    Какви IDE на Python трябва да гледам? 1. Pycharm Традиционният пълноценен редактор за Python от JetBrains. PyCharm предоставя широк набор от основни инструменти, тясно интегрирани за..

    Извличане на данни от API — част 2
    Научете как можете да филтрирате филми въз основа на различни категории. Моля, вижте предишния урок (Част 1) : Как да извличам данни от истински API — React / JS..

    Как да предотвратите влизането на някой от вашата кодова база
    // TLDR TypeScript добавя статично въвеждане към JavaScript, улавяйки грешки като препращане към променливи извън обхвата или извикване на функции с грешни аргументи. Той е несъвършен и има..

    Анализ на настроението с помощта на логистична регресия и наивен Бейс
    Нека сравним кой алгоритъм е по-добър за класифициране на туитовете въз основа на техните чувства. Наблюдаван ML При контролираното машинно обучение обикновено имате вход X, който влиза във..