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 里。
|
3
eccentric579 OP @ppj data 是用 communicate()阻塞获取的,放在一起不能并行
|
4
SenLief 2022-04-13 00:11:38 +08:00
为什么是构造 test 类,这并行的是把那个 pwsh 运行 500 次吗?
|
5
ec0 2022-04-13 00:12:06 +08:00 1
[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 1
[test()] * 5 有问题,都是同一个实例
(假设你要 ping 的地址是实例化的参数,那更容易理解 [test(ip)] *5 这样错在哪里了 |
7
eccentric579 OP @ec0 万分感谢,我自己一天都不一定能想到这里出错了
|
8
eccentric579 OP |