问题是,我正在运行一个启动4个线程的python3脚本。每个线程启动另一个脚本(在python2中)8次。
我希望这些调用在调用脚本之前等待结束,这就是为什么我使用p.community()和p.wait()。
但是我注意到线程忽略了p.community()和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)
有什么办法可以解决这个问题吗?我已经试过用call或check_call代替popen,但没有成功。
编辑 : "Starting 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
[.....]
正如 jordanm所说,"我的钱在testwait.py上",好吧,把你的btc地址发给我,你是对的。我的日志文件没有捕捉到stderr... ... 我用p.poll()检查了脚本的返回代码,确实是1。
谢谢你!