Python 关于Popen.wait阻碍通信

在Ubuntu 12.04和Python 2.7环境下,使用Popen.wait()导致协程中的socket通信受阻。通过启动新线程解决此问题,避免Popen.wait()阻碍其他功能执行。修改后的实现是使用threading.Thread来调用执行系统命令的函数,从而不影响主进程的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:ubuntu12.04  python2.7


    今天在平台的一个功能模块中出问题了。函数最后会启动一个协程,如下:

greenlet = gevent.Greenlet(self.do_sth, arg1, arg2)
greenlet.start()

    然后在def do_sth(arg1, arg2)中会调用一些系统命令来执行任务,我采用的subprocess.Popen,如下:

p = Popen(cmd1, shell=True)  

p.wait()

等于在启动的协程中调用了popen.wait。


问题出来了,我在执行这个功能模块的过程中,发现不能执行其他的功能了


原因应该是popen.wait阻碍了socket通信什么的,查找资料:

Popen.wait() 等待子进程结束。设置并返回returncode属性    http://blog.youkuaiyun.com/wuwangyingzhong/article/details/6002055

这样,当cmd1执行时,与进程相关的socket通信应该就被阻碍了。

据说有避免的方法:

http://www.bitscn.com/os/linux/200604/7172.html

http://ldl.wisplus.net/2010/10/01/linux%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%EF%BC%9A%E7%AE%A1%E9%81%93/

这两个都没有仔细看,也不知道说的啥,更不用说验证了。因为时间有点急,所以就避开这个方法。


我的解决办法:

因为调用了几次popen,一下子也找不到完好的替代方法,所以另找一个办法。既然与进程相关的通信被阻碍了,那我就用一个不会影响到通信的方法,那么另外启动一个线程好了。所以我改动了调用popen的协程。

将功能模块最后的协程调用改为线程调用,如下:

t = threading.Thread(target=self.do_sth,args=(arg1, arg2))
t.start()

def do_sth(arg1, arg2)中的一些具体的代码就不用改动了。

然后我的问题貌似解决了


最后,看到thread也可以用Join阻塞进程http://blog.youkuaiyun.com/cain/article/details/6602921


最后,我对这些不熟悉,如果有哪位看到我的解说有错误,烦请告知!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值