Краткое описаниеЛегкий способ отличить ОС Python многопроцессорной обработки обрабатывает
Я хотел бы использовать модуль многопроцессорной Python для выполнения нескольких заданий параллельно на сервере Linux. Кроме того, я хотел бы иметь возможность посмотреть запущенные процессы с top
или ps
и kill
один из них, но пусть остальные будут работать.
Однако я вижу, что каждый процесс, запущенный из модуля многопроцессорности Python, похож на команду ps -f
.
Все, что я вижу это:
fermion:workspace ross$ ps -f
UID PID PPID C STIME TTY TIME CMD
501 32257 32256 0 8:52PM ttys000 0:00.04 -bash
501 32333 32257 0 9:05PM ttys000 0:00.04 python ./parallel_jobs.py
501 32334 32333 0 9:05PM ttys000 0:00.00 python ./parallel_jobs.py
501 32335 32333 0 9:05PM ttys000 0:00.00 python ./parallel_jobs.py
501 32336 32333 0 9:05PM ttys000 0:00.00 python ./parallel_jobs.py
501 32272 32271 0 8:53PM ttys001 0:00.05 -bash
Есть ли способ, чтобы получить что-то более описательный в колонке CMD? Нужно ли мне просто отслеживать PID в файлах журналов? Или есть другой вариант?
фон
Я делаю некоторые пакетной обработки, где некоторые рабочие места могут работать в течение нескольких часов. Мне нужно иметь возможность запускать некоторые из этих заданий параллельно, чтобы сэкономить время. И все эти параллельные задания должны быть успешно завершены, прежде чем я смогу запустить другую работу, которая зависит от их всех. Однако, если одно задание неверно, я хочу уметь его убивать, давая возможность другим заполнить ... и это происходит там, где у меня есть одно задание, затем параллельные задания, затем еще несколько заданий, затем несколько параллельных заданий ...
Пример кода
Это некоторый фиктивный код, который описывает концепцию того, что я пытаюсь сделать.
#!/usr/bin/env python
import time
import multiprocessing
def open_zoo_cages():
print('Opening zoo cages...')
def crossing_road(animal, sleep_time):
print('An ' + animal + ' is crossing the road')
for i in range(5):
print("It's a wide road for " + animal + " to cross...")
time.sleep(sleep_time)
print('The ' + animal + ' is across.')
def aardvark():
crossing_road('aardvark', 2)
def badger():
crossing_road('badger', 4)
def cougar():
crossing_road('cougar', 3)
def clean_the_road():
print('Cleaning off the road of animal droppings...')
def print_exit_code(process):
print(process.name + " exit code: " + str(process.exitcode))
def main():
# Run a single job that must finish before running some jobs in parallel
open_zoo_cages()
# Run some jobs in parallel
amos = multiprocessing.Process(name='aardvark Amos', target=aardvark)
betty = multiprocessing.Process(name='badger Betty', target=badger)
carl = multiprocessing.Process(name='cougar Carl', target=cougar)
amos.start()
betty.start()
carl.start()
amos.join()
betty.join()
carl.join()
print_exit_code(amos)
print_exit_code(betty)
print_exit_code(carl)
# Run another job (clean_the_road) if all the parallel jobs finished in
# success. Otherwise end in error.
if amos.exitcode == 0 and betty.exitcode == 0 and carl.exitcode == 0:
clean_the_road()
else:
sys.exit('Not all animals finished crossing')
if __name__ == '__main__':
main()
Кроме того, я отметил, что ввод одной из функций в другом модуле Python не меняет того, что происходит в столбце ps
команды для соответствующего процесса.
Выход
fermion:workspace ross$ ./parallel_jobs.py
Opening zoo cages...
An aardvark is crossing the road
It's a wide road for aardvark to cross...
An badger is crossing the road
It's a wide road for badger to cross...
An cougar is crossing the road
It's a wide road for cougar to cross...
It's a wide road for aardvark to cross...
It's a wide road for cougar to cross...
It's a wide road for aardvark to cross...
It's a wide road for badger to cross...
It's a wide road for cougar to cross...
It's a wide road for aardvark to cross...
It's a wide road for badger to cross...
It's a wide road for aardvark to cross...
It's a wide road for cougar to cross...
The aardvark is across.
It's a wide road for badger to cross...
It's a wide road for cougar to cross...
The cougar is across.
It's a wide road for badger to cross...
The badger is across.
aardvark Amos exit code: 0
badger Betty exit code: 0
cougar Carl exit code: 0
Cleaning off the road of animal droppings...
контроль этот пост: http://stackoverflow.com/questions/564695/is-there-a-way-to-change-effective-process-name-in-python .. один из ответы упоминают https://github.com/dvarrazzo/py-setproctitle, которые могут сработать для вас. Это не похоже, что есть способ сделать это в vanilla python. –
Хм ... это интересно. Я думаю, что мне придется использовать multiprocessing.current_process(). Pid, а затем использовать эту библиотеку python (написанную на C, похоже), чтобы изменить имя процесса. –