2014-01-07 5 views
2

У меня есть сценарий Python, который порождает процесс демона. Внутри процесса я использую multiprocessing.pool для запуска 1 до 4 процессов одновременно.Python - вызов multiprocessing.pool внутри демона

Когда я запускаю это вне процесса демона, он отлично работает (то есть, когда я установил run_from_debugger=True - см код ниже), но если я запускаю код с помощью процесса демона (т.е. run_from_debugger=False), async_function никогда не выполняется ,

Можно ли использовать multiprocessing.pool внутри a daemon процесс ??? Я использую Python-daemon 1.6 как мой пакет daemon (если это имеет значение).

Код:

def loop_callback(params): 
    #Spawn the process in the pool 
    # Because loop_callback is called many times, often faster than async_function executes, 
    # adding them to a pool allows for parallel execution. 
    pool.apply_async(async_function, params) 


def run_service(): 
    # loop is a method that can/will call loop_callback multiple times, and it will call 
    # loop_callback faster than the code in asyc_function executes 
    loop(alignment_watch_folder, sleep_duration) 


#Class declaration 
app = App() 

#Declare a pool of processes 
# processes=1 indicates serial execution 
pool = Pool(processes=4) 

#Either run from a daemon process or not 
run_from_debugger = False 

#Run the daemon process 
if run_from_debugger: 
    run_service() 
else: 
    daemon_runner = runner.DaemonRunner(app) 
    daemon_runner.do_action() 

Любые советы будут оценены.

ответ

2

Цитируя документации multiprocessing:

daemon

The process’s daemon flag, a Boolean value. This must be set before start() is called.

The initial value is inherited from the creating process.

When a process exits, it attempts to terminate all of its daemonic child processes.

Note that a daemonic process is not allowed to create child processes. Otherwise a daemonic process would leave its children orphaned if it gets terminated when its parent process exits. Additionally, these are not Unix daemons or services, they are normal processes that will be terminated (and not joined) if non-daemonic processes have exited.

Поскольку multiprocessing.Pool должен создавать рабочие процессы, вы не можете daemonaize процесс его использования.

+0

Хмммм .... есть ли какие-либо другие способы? – Brett

+0

Эта документация похожа на метод «Процесс», а не на метод «Пул», о котором я говорил. Не разрешается ли «демонический процесс создавать дочерние процессы» для «пула»? – Brett

+1

@Brett «Многопроцессорный.Pool» - это просто объект, который обрабатывает фиксированное количество «многопроцессорных.Process». На самом деле с помощью простого теста я получаю «AssertionError: у демонических процессов не разрешено иметь детей». Если вы не получаете эту ошибку, возникает другая проблема. Вы уверены, что 'asynch_function' называется * not *? Поскольку библиотека 'python-daemon' отделяет процесс от своего терминала, поэтому нормально не видеть ничего на экране. – Bakuriu

Смежные вопросы