popen后fget阻塞问题
时间: 2023-06-05 10:01:13 浏览: 479
popen函数是用来创建子进程并在子进程中执行一个shell命令的函数,执行结果可以被父进程获取。而fget函数则是用来从文件流中读取数据的函数。
在使用popen函数创建子进程时,如果在子进程中执行的命令输出的数据量较大,父进程调用fget函数时可能会发生阻塞的情况。这是因为在子进程的输出缓冲区还未被完全读取完成前,fget函数会一直等待缓冲区中出现新的数据,并阻塞在这里,导致程序停顿。
为了避免这种阻塞的情况,我们可以使用非阻塞的IO方式来读取子进程的输出数据。可以使用select函数来检查文件描述符上是否有数据可读,如果有则立即读取,并把读取的数据写入一个输出缓冲区中。在缓冲区已满或者数据已经全部读取完成后,再把缓冲区中的数据写入文件或者终端显示。
除此之外,还可以用线程的方式来读取子进程的输出数据,这样就可以避免主线程的阻塞,提高程序的响应速度。但这样会增加程序的复杂度和开销,需要谨慎使用。
相关问题
subprocess.popen返回不阻塞
subprocess.popen是Python标准库中提供的一个用于创建子进程的方法。它的主要作用是在Python程序中启动其他程序,并与其进行交互。而返回不阻塞则是指该方法在执行时不会阻塞主进程的执行。
最常用的方式是使用subprocess.popen来启动另一个程序,然后通过管道(pipe)与它进行通信。在此过程中,通常需要在主进程中不断地检查子进程的状态以及读取其输出。但是,如果使用了返回不阻塞的方式,主进程就不需要等待子进程结束或输出数据,而可以继续执行其他任务。
具体来说,subprocess.popen设置了stdin、stdout和stderr参数为PIPE时,它会返回一个Popen对象,而不会等待子进程的执行。这个Popen对象可以用于交互和控制子进程的状态,在只需要一些后台进程时非常有用。
需要注意的是,虽然不阻塞可以提高程序的响应速度,但也需要仔细处理子进程的异常退出和资源释放等问题,否则可能会导致程序崩溃或产生严重的错误,极大地影响程序的效率和稳定性。因此,在使用subprocess.popen时,需要权衡利弊,选择适合自己应用场景的方式。
subprocess.popen阻塞
subprocess.Popen在读取子进程的标准输出时,如果子进程没有输出,使用stdout.read()会导致程序阻塞。 为了避免阻塞,可以采用两种方法。一种是在读取输出之前,将文件描述符设置为非阻塞模式,例如使用fcntl库的fcntl函数进行设置。具体实现可以参考下面的代码示例:
```
import select
import os
import subprocess
import time
import fcntl
args = ['python','./fetch_file2.py',ip,path]
proc = subprocess.Popen(args, stdout=subprocess.PIPE,stderr=subprocess.PIPE,close_fds=True)
def non_block_read(output): # 避免阻塞
fd = output.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
try:
return output.read()
except:
return ""
while proc.poll() is None: #fetch中rsync结束。但是fetch没有结束(怀疑输出过大) 导致这里一直是None
pass
print proc.poll() # 杀死fetch进程 返回-9
print proc.stderr.read() #阻塞#方法1:
#non_block_read(proc.stderr) #防止阻塞#方法2:
select_rfds = [ proc.stdout, proc.stderr]
(rfds, wfds, efds) = select.select(select_rfds, [],[])
if proc.stderr in rfds: #不存在。若select_rfds=[stderr],则阻塞在select上
len = proc.stderr.read(10)
if len == 0:
print "empty"
else:
print "proc.stderr"
if proc.stdout in rfds:
print "proc.stdout"
```
通过设置文件描述符为非阻塞模式,可以避免阻塞问题,并且使用select.select来检查子进程的标准输出是否可读。 这样即可解决subprocess.Popen阻塞的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [对Python subprocess.Popen子进程管道阻塞详解](https://download.csdn.net/download/weixin_38661128/12866393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [python subprocess.Popen read阻塞问题解决](https://blog.csdn.net/weixin_41582874/article/details/127939185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [python subprocess阻塞](https://blog.csdn.net/weixin_30855761/article/details/99389411)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)