Von subprocess.Popen zu Daemon mit multiprocessing.pool
Verfasst: Samstag 29. August 2015, 19:20
Hallo,
ich möchte folgendes Ausgangssituation umbauen. Ich habe ein Python-File welches schaut ob neue Daten da. Falls ja, werden diese an ein weiteres File gegeben, damit diese verarbeitet werden.
Ich benutze im dem Fall ``subprocess.Popen`` damit die Sachen parallel verarbeitet werden können. Jetzt laufe ich aber in das Problem, dass ich nicht steuern kann wie viele Prozesse laufen dürfen. Im Idealfall sind es "Anzahl der CPUs - 1". Zudem würde ich das gerne in einem Daemon laufen lassen, also das prüfen ob neue Daten sind und dann die Prozesse füttern. Derzeit wird das obige File über einen Cronjob aufgerufen.
So recht weiter komme ich da aber nicht. Jemand eine Idee wie man da am Besten ansetzt? Braucht man bei ``multiprocessing.Pool`` wirklich immer einen Rückgabewert bei der Funktion?
ich möchte folgendes Ausgangssituation umbauen. Ich habe ein Python-File welches schaut ob neue Daten da. Falls ja, werden diese an ein weiteres File gegeben, damit diese verarbeitet werden.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess
def get_input_files(directory):
new_files = list()
for subdir, dirs, files in os.walk(directory, followlinks=True):
for f in files:
new_files.append(os.path.join(subdir, f))
return new_files
def start_process(files_to_process):
for f in files_to_process:
subprocess.Popen(['python', 'process_data.py', '-i', f])
def main():
files_to_process = get_input_files('input')
start_process(files_to_process)
if __name__ == '__main__':
main()
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
def process_data(input_file):
pass
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='input_file', action='store')
args = parser.parse_args()
if args.input_file is None:
parser.print_help()
else:
process_data(args.input_file)
if __name__ == '__main__':
main()
So recht weiter komme ich da aber nicht. Jemand eine Idee wie man da am Besten ansetzt? Braucht man bei ``multiprocessing.Pool`` wirklich immer einen Rückgabewert bei der Funktion?