在线程中使用Popen的奇怪行为

问题是,我正在运行一个启动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。

谢谢你!

给TA打赏
共{{data.count}}人
人已打赏
未分类

AWS Cognito预令牌生成lambda触发器。

2022-9-23 10:38:24

未分类

如何在终端解压tensorflow枢纽模块?

2022-9-23 10:38:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索