2017-02-20 2 views
-1

Я пытаюсь одновременно запустить две функции в Python. Обе функции содержат петли while. Я старался использовать потоки и многопроцессорность без радости. Выполняется только одна функция. Я прочитал и попробовал несколько примеров на Stack и net. Любая помощь будет оценена по достоинству. Заранее спасибо. Я новичок в Python.Запустите две функции, которые одновременно содержат петли в Python с использованием многопоточности

if __name__ == "__main__": 
    ap = argparse.ArgumentParser() 
    ap.add_argument("-c", "--conf", required=True, 
     help="path to the JSON configuration file") 
    args = vars(ap.parse_args()) 
# p1 = Process(target=main(args)) 
# p2 = Process(target=cameraHandler(args)) 
# p1.start() 
# p2.start() 

    threadA = Thread(target = main(args)) 
    threadB = Thread(target = cameraHandler(args)) 
    threadA.run() 
    threadB.run() 

    threadA.join() 
    threadB.join() 
+0

Для правильной работы функций «в то же время» вам необходимо использовать «многопроцессорность». Кроме того, я надеюсь, вы понимаете, что '//' не является комментарием в Python ... вы хотите '#' –

+0

@ juanpa.arrivillaga Это отличный ответ, молодец! И, как вы знаете, все это может быть достигнуто с помощью многопоточности. Кроме того, я знаю, что ## является комментарием в Python. Отличный ответ, вы, очевидно, знаете много! Почему вы не дали решение вопроса вместо отрицательного комментария? – Wazzi

+0

Я просто просил разъяснений, потому что вы говорите, что хотите дважды запустить две функции * одновременно, а в CPython это невозможно с помощью 'multithreading', поскольку GIL гарантирует, что только один поток работает в интерпретаторе в один раз. Если вы действительно хотите использовать многоядерную архитектуру и запускать параллельные операции, вы должны использовать «многопроцессорность». API очень похож, поэтому, если это вас беспокоит, вы должны легко конвертировать свой код. Я не спустил тебя вниз. –

ответ

0

В вашем примере, у вас есть target = main(args) и target = cameraHandler(args). В обоих случаях вы вызываете функцию непосредственно, а не оставляете поток для этого. Таким образом, вызывается только первое, а threadA даже не создано. Вы должны проходить сами функции (main и cameraHandler) до Thread, без, называя их.

Чтобы исправить это, используйте аргумент ключевого слова args для Thread. Вы также должны использовать метод .start()Thread.

Thread(target=main, args=(args,)).start() 
Thread(target=cameraHandler, args=(args,)).start() 

Это предполагает, что args это единственный аргумент, вы хотели бы перейти к каждой из функций. Если это кортеж всех аргументов, которые вы хотели бы передать, используйте args=args. Например, если вы хотите, чтобы поток выполнялся f(1, 2, 3), используйте Thread(target=f, args=(1, 2, 3)).

+0

не должны ли темы быть дьямонами? Если я правильно напомню, что python будет ждать завершения потока, прежде чем продолжить, если поток не будет deamon. –

+0

@OwainvanBrakel. Согласно моему тестированию, это работает без демонстрации потоков. :) –

+0

Я этого не ожидал ... Спасибо за ответ! –

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