Python 保留文件描述符以防止FD耗尽
我有一个具有多个线程的python应用程序,线程2到n可能会打开任意数量的文件。我想确保当线程1试图打开一个文件时,它肯定不会因为文件描述符耗尽而失败。简而言之,我想保留文件描述符而不打开它们。 我只能控制从线程1运行的代码,该线程是在仍然有大量文件描述符的时候生成的 (作为一个例子,我想这可以通过从线程1打开/dev/null几次来“保留”fd来实现,并在线程1需要打开文件时将其关闭,从而确保至少有一个未使用的fd,但这最终会引入竞争条件。)Python 保留文件描述符以防止FD耗尽,python,Python,我有一个具有多个线程的python应用程序,线程2到n可能会打开任意数量的文件。我想确保当线程1试图打开一个文件时,它肯定不会因为文件描述符耗尽而失败。简而言之,我想保留文件描述符而不打开它们。 我只能控制从线程1运行的代码,该线程是在仍然有大量文件描述符的时候生成的 (作为一个例子,我想这可以通过从线程1打开/dev/null几次来“保留”fd来实现,并在线程1需要打开文件时将其关闭,从而确保至少有一个未使用的fd,但这最终会引入竞争条件。) 有没有一种方法可以确保线程1在需要FD时可以使用F
有没有一种方法可以确保线程1在需要FD时可以使用FD,而无需修改线程2-n的功能?您需要使用互斥锁。对于Python2.x,这是or模块 在“线程1”中,您将首先访问(获取/锁定)互斥体,然后关闭保留的fd并打开真正的fd,然后释放互斥体 在其他线程中,只需等待获得互斥体,然后打开文件,然后释放互斥体 对于python3,它是来自模块的锁
(注意:我不是在评论打开/dev/null是否能达到您预定fd的目的,因为我对此没有信心。我只是为您提供了一个如何避免您所问的竞争的解决方案:)。您的问题是“我能以这种方式预定fd吗”?(由“我想象”暗示),还是“我如何避免一场比赛?”这是两个独立的问题-每个帖子限制有一个问题:)主要问题是“我可以保留FD吗,如果可以,如何保留”,而“我如何避免一场比赛”只适用于快速示例解决方案。我不明白您想要实现的目标。如果您完成了fds,那么无论您是否有
互斥体
等,其他线程都会失败,因为它们无法写入文件。您只需编写自定义的open
替换,在缺少fds的情况下,该替换会使线程稍微休眠并重试,直到它工作(或最多n次)。通过这种方式,您可以处理这种情况,而不必在线程的逻辑中插入特殊的案例代码。我无法控制其他线程的操作,它们可能来自不受信任的插件。他们被允许执行任意代码。那么你就不能保护自己免受与他们的竞争,AFAICS。这意味着你需要一个更像巴库留建议的解决方案。事实上,这似乎是一个很好的、类似Python的解决方案:如果失败,请先睡觉,然后重试。