class test(object): def __init__(self) -> None: self.p = None self.data = None def request(self): self.p = subprocess.Popen(['pwsh' ,'-Command' ,'ping', '127.0.0.1'], stdout=subprocess.PIPE, encoding='gbk') def process(self): self.data = self.p.communicate()[0] if __name__ == "__main__": l = [test()] * 5 for i in l: i.request() for i in l: i.process()
def request(): return subprocess.Popen(['pwsh' ,'-Command' ,'ping', '127.0.0.1'], stdout=subprocess.PIPE, encoding='gbk') def process(p): p.communicate()[0] if __name__ == "__main__": pool= [] for _ in range(5): pool.append(request()) for p in pool: process(p)
1 lolizeppelin 2022-04-12 23:27:08 +08:00 subprocess 不长建议你好好读一下,本质上都会用到系统函数进行父子进程互交,win/linux 还不一样。 |
![]() | 2 ppj 2022-04-12 23:52:54 +08:00 建议加数据 data 的获取和 p 放在 request 里,数据处理放在 process 里。 |
![]() | 4 SenLief 2022-04-13 00:11:38 +08:00 为什么是构造 test 类,这并行的是把那个 pwsh 运行 500 次吗? |
5 ec0 2022-04-13 00:12:06 +08:00 ![]() [test()] * 5 相当于 t = test() [t, t, t, t, t] 也就是说 list 里的是同一个 t ,对同一个 t 多次调用 communication 自然会报错 改成 [test() for i in range(5)] 这样生成的才是 5 个不一样的对象 |
![]() | 6 imycc 2022-04-13 00:32:42 +08:00 ![]() [test()] * 5 有问题,都是同一个实例 (假设你要 ping 的地址是实例化的参数,那更容易理解 [test(ip)] *5 这样错在哪里了 |
![]() | 7 eccentric579 OP @ec0 万分感谢,我自己一天都不一定能想到这里出错了 |
![]() | 8 eccentric579 OP |