Вот подвох, я запускаю 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
[.....]