2016-04-24 9 views
0

Ich entwickle ein Projekt, in dem ich etwa 6 Sensoren in einem Beaglebone Black, die speichert diese Daten in 6 verschiedenen Dateien kontinuierlich. Durch eine andere SO-Frage (https://stackoverflow.com/a/36634587/2615940) erfuhr ich, dass das Multiprocessing-Modul dies für mich tun würde, aber wenn ich meinen neuen Code ausführe, erhalte ich nur eine Datei im Gegensatz zu 6. Wie kann ich diesen Code ändern, um die gewünschten 6 Ergebnisdateien zu erhalten ?Gleichzeitiges Schreiben von Dateien mit Python Multiprocessing

* Ich habe meine Datei bearbeitet, um Manager nach skrrgwasme Vorschlag unten enthalten, aber jetzt läuft der Code, und produziert nichts. Keine Fehler, keine Dateien. Läuft einfach.

Der Code:

import Queue 
import multiprocessing 
import time 

def emgacq(kill_queue, f_name, adcpin): 
    with open(f_name, '+') as f: 
     while True: 
      try: 
       val = kill_queue.get(block = False) 
       if val == STOP: 
        return 
      except Queue.Empty: 
       pass 
      an_val = ADC.read(adcpin) * 1.8 
      f.write("{}\t{}\n".format(ms, an_val)) 
def main():  
    #Timing stuff 
    start = time.time() 
    elapsed_seconds = time.time() - start 
    ms = elapsed_seconds * 1000 

    #Multiprcessing settings 
    pool = multiprocessing.Pool() 
    m = multiprocessing.Manager() 
    kill_queue = m.Queue()    

    #All the arguments we need run thru emgacq() 
    arg_list = [ 
     (kill_queue, 'HamLeft', 'AIN1'), 
     (kill_queue, 'HamRight', 'AIN2'), 
     (kill_queue, 'QuadLeft', 'AIN3'), 
     (kill_queue, 'QuadRight', 'AIN4'), 
     (kill_queue, 'GastLeft', 'AIN5'), 
     (kill_queue, 'GastRight', 'AIN6'), 
     ] 

    for a in arg_list: 
     pool.apply_async(emgacq, args=a) 

    try: 
     while True: 
      time.sleep(60) 
    except KeyboardInterrupt: 
     for a in arg_list: 
      kill_queue.put(STOP) 
     pool.close() 
     pool.join() 
     raise f.close() 

if __name__ == "__main__": 
    main() 
+0

die Probleme Gegeben Sie mit beiden zu tun habe für diese Fragen, empfehle ich Ihnen einige Tutorials grundlegende Python zu gehen. Es scheint, als ob Sie etwas über grundlegende Ideen wie Funktionsaufrufe, Variablenzuweisungen und Argumentübergabe verwirrt sind. Sie werden viel mehr Erfolg haben, wenn Sie diese Grundlagen verstehen, bevor Sie in Ihr nächstes Skript/Programm eintauchen. – skrrgwasme

Antwort

2

Ihr Hauptproblem ist, dass die Liste der Argumente für Ihre subprocess Funktionen ist falsch:

f_list = [ 
    emgacq(kill_queue, 'HamLeft', 'AIN1'), 
    # this calls the emgacq function right here - blocking the rest of your 
    # script's execution 

Auch Ihr apply_async Aufruf ist falsch:

for f in f_list: 
    pool.apply_async(f, args=(kill_queue)) 
    # f is not a function here - the arguments to the apply_async function 
    # should be the one function you want to call followed by a tuple of 
    # arguments that should be provided to it 

Sie wollen dies, die auch eine manager für die qu enthält eue (siehe https://stackoverflow.com/a/9928191/2615940) und den gesamten Code bringt eine main Funktion:

# put your imports here 
# followed by the definition of the emgacq function 

def main(): 

    #Timing stuff 
    start = time.time() 
    elapsed_seconds = time.time() - start 
    ms = elapsed_seconds * 1000 

    pool = multiprocessing.Pool() 
    m = multiprocessing.Manager() 
    kill_queue = m.Queue() 

    arg_list = [ 
      (kill_queue, 'HamLeft', 'AIN1'), 
      (kill_queue, 'HamRight', 'AIN2'), 
      (kill_queue, 'QuadLeft', 'AIN3'), 
      (kill_queue, 'QuadRight', 'AIN4'), 
      (kill_queue, 'GastLeft', 'AIN5'), 
      (kill_queue, 'GastRight', 'AIN6'), 
     ] 

    for a in arg_list: 
     pool.apply_async(emgacq, args=a) 
     # this will call the emgacq function with the arguments provided in "a" 

if __name__ == "__main__": 
    # you want to have all of your code in a function, because the workers 
    # will start by importing the main module they are executing from, 
    # and you don't want them to execute that code all over again 
    main() 
+0

Ich kann nicht verstehen, was hier vor sich geht. Es scheint jetzt ein Erbschaftsproblem zu geben. "Warteschlangenobjekte sollten nur zwischen Prozessen durch Vererbung geteilt werden". – boktor

+0

@boktor Siehe bearbeiten. – skrrgwasme

+0

Ich habe den Hauptpost bearbeitet, damit Sie sehen können, was passiert ist, als ich 'Manager.' probiert habe. Muss ich einstellen, wo ich' kill_queue' jetzt verwende, dass sich die Definition geändert hat? ('kill_queue = m.Queue()' anstelle von 'kill_queue = multiprocessing.Queue') – boktor