2016-04-24 2 views
0

Я разрабатываю проект, в котором я использую около 6 датчиков, подающих в Beaglebone Black, который сохраняет эти данные в 6 разных файлах непрерывно. Через другой вопрос SO (https://stackoverflow.com/a/36634587/2615940) я узнал, что модуль многопроцессорности сделает это для меня, но при запуске моего нового кода я получаю только 1 файл, а не 6. Как я могу изменить этот код, чтобы получить желаемые 6 файлов результатов ?Одновременная запись файлов с использованием многопроцессорной обработки python

* Я отредактировал свой файл, чтобы включить Manager согласно предложению skrrgwasme ниже, но теперь код запускается и ничего не производит. Нет ошибок, нет файлов. Просто бежит.

Код:

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

Учитывая проблемы, вы имели дело с для обоих этих вопросов, я настоятельно рекомендую вам пройти через некоторые основные учебники Python. Похоже, у вас есть путаница в отношении фундаментальных идей, таких как вызовы функций, назначения переменных и передача аргументов. У вас будет намного больше успеха, если вы сможете получить понимание этих основ перед погружением в свой следующий скрипт/программу. – skrrgwasme

ответ

2

Ваша главная проблема в том, что ваш список аргументов для ваших функций подпроцессов неправилен:

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

Кроме того, ваш apply_async вызов является неправильным:

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 

Вы хотите это, которое также включает manager для qu EUE (см https://stackoverflow.com/a/9928191/2615940) и помещает весь код в main функции:

# 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

Я не могу понять, что здесь происходит. Кажется, теперь есть проблема наследования. В частности, «объекты очереди должны делиться только между процессами через наследование». – boktor

+0

@boktor См. Редактирование. – skrrgwasme

+0

Я отредактировал главный пост, чтобы вы могли видеть, что произошло, когда я попробовал «Менеджер». Нужно ли мне настроить, где я использую 'kill_queue', теперь, когда это определение изменилось? ('kill_queue = m.Queue()' вместо 'kill_queue = multiprocessing.Queue') – boktor

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