异步调用完成之前文件关闭,导致IO错误

时间:2017-05-15 17:58:17

标签: python asynchronous io

我写了一个包,其中包含一个异步上传内容的函数。目的是用户可以使用我的包,打开文件,并将其上传为异步。问题是,根据用户编写代码的方式,我会收到IO错误。

# EXAMPLE 1
with open("my_file", "rb") as my_file:
    package.upload(my_file)
# I/O operation on closed file error



#EXAMPLE 2
my_file = open("my_file", "rb")
package.upload(my_file)
# everything works

据我所知,在第一个示例中,文件立即关闭,因为调用是异步的。我不知道怎么解决这个问题。我无法告诉用户他们无法以示例1的方式打开文件。我可以在package.upload()实现中执行某些操作来阻止文件关闭吗?

2 个答案:

答案 0 :(得分:1)

如果您使用with打开文件,那么当代码块执行在with内完成时,它将关闭。在您的情况下,只需在open函数

中传递filename和asynchronus

答案 1 :(得分:1)

您可以使用os.dup复制文件描述符,并屏蔽异步进程与调用方中的关闭。重复的句柄共享原始文件的其他特征,例如当前文件位置,因此您不会完全屏蔽调用者可以执行的错误操作。

这也会将您的流程限制为具有文件描述符的内容。如果您坚持使用标准文件调用,那么用户可以提交任何类似文件的对象,而不仅仅是磁盘上的文件。

def upload(my_file):
    my_file = os.fdopen(os.dup(my_file.fileno()))
    # ...queue for async