[求助提问] subprocess 的并行的一个问题

2022-04-12 23:17:46 +08:00
 eccentric579
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()
1984 次点击
所在节点    Python
8 条回复
lolizeppelin
2022-04-12 23:27:08 +08:00
subprocess 不长建议你好好读一下,本质上都会用到系统函数进行父子进程互交,win/linux 还不一样。
ppj
2022-04-12 23:52:54 +08:00
建议加数据 data 的获取和 p 放在 request 里,数据处理放在 process 里。
eccentric579
2022-04-12 23:59:17 +08:00
@ppj data 是用 communicate()阻塞获取的,放在一起不能并行
SenLief
2022-04-13 00:11:38 +08:00
为什么是构造 test 类,这并行的是把那个 pwsh 运行 500 次吗?
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 个不一样的对象
imycc
2022-04-13 00:32:42 +08:00
[test()] * 5 有问题,都是同一个实例

(假设你要 ping 的地址是实例化的参数,那更容易理解 [test(ip)] *5 这样错在哪里了
eccentric579
2022-04-13 00:33:08 +08:00
@ec0 万分感谢,我自己一天都不一定能想到这里出错了
eccentric579
2022-04-13 00:35:48 +08:00
@SenLief
只是为了测试并行,所以没有给对象初始化赋值

@imycc
是啊是啊,只是想偷个懒的,结果把自己绕进去了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846632

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX