Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 保留文件描述符以防止FD耗尽_Python - Fatal编程技术网

Python 保留文件描述符以防止FD耗尽

Python 保留文件描述符以防止FD耗尽,python,Python,我有一个具有多个线程的python应用程序,线程2到n可能会打开任意数量的文件。我想确保当线程1试图打开一个文件时,它肯定不会因为文件描述符耗尽而失败。简而言之,我想保留文件描述符而不打开它们。 我只能控制从线程1运行的代码,该线程是在仍然有大量文件描述符的时候生成的 (作为一个例子,我想这可以通过从线程1打开/dev/null几次来“保留”fd来实现,并在线程1需要打开文件时将其关闭,从而确保至少有一个未使用的fd,但这最终会引入竞争条件。) 有没有一种方法可以确保线程1在需要FD时可以使用F

我有一个具有多个线程的python应用程序,线程2到n可能会打开任意数量的文件。我想确保当线程1试图打开一个文件时,它肯定不会因为文件描述符耗尽而失败。简而言之,我想保留文件描述符而不打开它们。 我只能控制从线程1运行的代码,该线程是在仍然有大量文件描述符的时候生成的

(作为一个例子,我想这可以通过从线程1打开/dev/null几次来“保留”fd来实现,并在线程1需要打开文件时将其关闭,从而确保至少有一个未使用的fd,但这最终会引入竞争条件。)


有没有一种方法可以确保线程1在需要FD时可以使用FD,而无需修改线程2-n的功能?

您需要使用互斥锁。对于Python2.x,这是or模块

在“线程1”中,您将首先访问(获取/锁定)互斥体,然后关闭保留的fd并打开真正的fd,然后释放互斥体

在其他线程中,只需等待获得互斥体,然后打开文件,然后释放互斥体

对于python3,它是来自模块的锁


(注意:我不是在评论打开/dev/null是否能达到您预定fd的目的,因为我对此没有信心。我只是为您提供了一个如何避免您所问的竞争的解决方案:)。

您的问题是“我能以这种方式预定fd吗”?(由“我想象”暗示),还是“我如何避免一场比赛?”这是两个独立的问题-每个帖子限制有一个问题:)主要问题是“我可以保留FD吗,如果可以,如何保留”,而“我如何避免一场比赛”只适用于快速示例解决方案。我不明白您想要实现的目标。如果您完成了fds,那么无论您是否有
互斥体
等,其他线程都会失败,因为它们无法写入文件。您只需编写自定义的
open
替换,在缺少fds的情况下,该替换会使线程稍微休眠并重试,直到它工作(或最多
n次)。通过这种方式,您可以处理这种情况,而不必在线程的逻辑中插入特殊的案例代码。我无法控制其他线程的操作,它们可能来自不受信任的插件。他们被允许执行任意代码。那么你就不能保护自己免受与他们的竞争,AFAICS。这意味着你需要一个更像巴库留建议的解决方案。事实上,这似乎是一个很好的、类似Python的解决方案:如果失败,请先睡觉,然后重试。