Странное поведение с использованием Popen внутри потоков - PullRequest
0 голосов
/ 22 апреля 2020

Вот подвох, я запускаю python3 скрипт, который запускает 4 потока. Каждый поток запускает другой скрипт (в python2) 8 раз.

Я хочу, чтобы эти вызовы ждали конца, прежде чем вызывать скрипт, поэтому я использую p.communicate () и p.wait ().

Однако я заметил, что потоки просто игнорируют p.communicate () и p.wait () и продолжают вызывать popen без ожидания.

Вот упрощенные версии моих скриптов, которые воспроизводят поведение.

Python3 скрипт

import threading
import threading
def run_thread(nb_processes):
    for index in range(nb_processes):
      print("Starting {}".format(index))
      call = 'python2 testwait.py'
      p = subprocess.Popen(call.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      p.communicate()
      p.wait()


def main():
    nb_concurrent_threads = 4
    nb_process_to_call_by_thread = 8
    threads = []
    for thread in range(nb_concurrent_threads):
        print("Thread : {}".format(thread))
        t = threading.Thread(target=run_thread, args=[nb_process_to_call_by_thread])
        threads.append(t)
        t.start()
    for thread in threads:
        thread.join()
        print(thread.stdout)
    return

if __name__ == '__main__':
    main()

Python2 скрипт

import time
for i in range(0,100):
  print(i)
  time.sleep(1)

Любые идеи по почему это происходит? Я уже пытался заменить popen на call или check_call без какого-либо успеха.

Редактировать: «Начиная с 2,3, ...» печатаются сразу после запуска скрипта, однако после python2 может пройти больше времени запуск сценария должен занять некоторое время.

Thread : 0                                                                                                                                                                                                         
Starting 0                                                                                                                                                                                                         
Thread : 1                                                                                                                                                                                                         
Starting 0                                                                                                                                                                                                         
Thread : 2                                                                                                                                                                                                         
Starting 0                                                                                                                                                                                                         
Thread : 3                                                                                                                                                                                                         
Starting 0                                                                                                                                                                                                         
Starting 1                                                                                                                                                                                                         
Starting 1                                                                                                                                                                                                         
Starting 1                                                                                                                                                                                                         
Starting 2                                                                                                                                                                                                         
Starting 2                                                                                                                                                                                                         
Starting 2                                                                                                                                                                                                         
Starting 3                                                                                                                                                                                                         
Starting 3                                                                                                                                                                                                         
Starting 3                                                                                                                                                                                                         
Starting 4                                                                                                                                                                                                         
Starting 4                                                                                                                                                                                                         
Starting 4                                                                                                                                                                                                         
Starting 5                                                                                                                                                                                                         
Starting 5                                                                                                                                                                                                         
Starting 5                                                                                                                                                                                                         
[.....]

1 Ответ

0 голосов
/ 23 апреля 2020

Как сказал Джорданм, "мои деньги на testwait.py", пришлите мне свой адрес BT c, вы были правы. Мой файл журнала не захватил stderr ... Я проверил код возврата скрипта с помощью p.poll (), и он действительно был 1.

Спасибо!

...