我有一个奇怪的问题,我无法自己解决。
如果我在两个单独的终端中执行outside_func.py
,第二次执行会捕获BlockingIOError异常并打印消息:
outside_func.py
import fcntl
import time
# Raise BlockingIOError if same script is already running.
try:
lockfile = open('lockfile', 'w')
fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError:
print('Script already running.')
time.sleep(20)
如果我对inside_func.py
执行相同操作,则不会捕获任何内容并且不会打印任何消息:
inside_func.py
import fcntl
import time
# Raise BlockingIOError if same script is already running.
def script_already_running():
try:
lockfile = open('lockfile', 'w')
fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError:
print('Script already running.')
script_already_running()
time.sleep(20)
有什么想法吗?
答案 0 :(得分:1)
当您离开该函数时文件被关闭,因此两个片段不相同,在代码片段中,try 在函数外部仍然存在对文件对象的引用睡眠调用的范围,所以进一步调用正确地打开 lockfile 错误。如果通过在函数内部移动睡眠来更改函数,您将看到引发的错误,因为现在您具有可比较的代码:
import fcntl
import time
# Raise BlockingIOError if same script is already running.
def script_already_running():
try:
lockfile = open('lockfile', 'w')
fcntl.flock(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError:
print('except')
sleep(20)