1 回答

TA貢獻2065條經驗 獲得超14個贊
問題不是來自此代碼中的問題是 tempfile.mkstemp()
實際上打開了該文件:create_subprocess_exec
mkstemp() 返回一個元組,其中包含一個打開文件的操作系統級句柄(由 os.open()返回) ...
我以為它只會創建文件。為了解決我的問題,我只是在 中添加了一個調用。這消除了錯誤,但有點奇怪(打開文件兩次)。所以我把它改寫為:os.close(handle)
import aiofiles
import tempfile
import uuid
async def main():
await asyncio.gather(*[fds_test(i) for i in range(10)])
async def fds_test(index):
dir_name = tempfile.gettempdir()
file_id = f"{tempfile.gettempprefix()}{uuid.uuid4()}"
temp_filename = f"{dir_name}/{file_id}.dat"
async with aiofiles.open(temp_filename, mode='w') as fp:
await fp.write('stuff')
bash_cmd = 'cat {}'.format(temp_filename)
process = await asyncio.create_subprocess_exec(*bash_cmd.split(), close_fds=True)
await process.wait()
if __name__ == "__main__":
import asyncio
asyncio.run(main())
現在我想知道為什么錯誤是由而不是引起的,也許是因為它子進程打開了更多的文件,以至于它不太可能使臨時文件創建成為打破限制的原因......subprocesstempfile.mkstemp
添加回答
舉報