python - 致命的 Python 错误:无法获取 <_io.BufferedReader name=' 的锁'> 在解释器关闭时,可能是由于守护线程
问题描述
我想编写一个python脚本,如果我没有通过输入命令输入任何值,那么它应该在30秒后为我的变量分配一个默认值,我的平台是windows 7
from func_timeout import func_timeout, FunctionTimedOut
def doit():
value = input("enter")
try:
doitReturnValue = func_timeout(5, doit)
except FunctionTimedOut:
value = "default value"
这是我得到的错误:
"C:\Users\Arpit\PycharmProjects\Complete Test\venv\Scripts\python.exe" "C:/Users/Arpit/PycharmProjects/Complete Test/test_for_timeout.py"
enterFatal Python error: could not acquire lock for <_io.BufferedReader name='<stdin>'> at interpreter shutdown, possibly due to daemon threads
Python runtime state: finalizing (tstate=00000000003CAE20)
Thread 0x00000c18 (most recent call first):
File "C:\Users\Arpit\AppData\Local\Programs\Python\Python38\lib\threading.py", line 1027 in _wait_for_tstate_lock
File "C:\Users\Arpit\AppData\Local\Programs\Python\Python38\lib\threading.py", line 1015 in join
File "C:\Users\Arpit\PycharmProjects\Complete Test\venv\lib\site-packages\func_timeout\StoppableThread.py", line 126 in run
File "C:\Users\Arpit\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932 in _bootstrap_inner
File "C:\Users\Arpit\AppData\Local\Programs\Python\Python38\lib\threading.py", line 890 in _bootstrap
Thread 0x0000106c (most recent call first):
File "C:/Users/Arpit/PycharmProjects/Complete Test/test_for_timeout.py", line 7 in doit
File "C:\Users\Arpit\PycharmProjects\Complete Test\venv\lib\site-packages\func_timeout\dafunc.py", line 68 in funcwrap
File "C:\Users\Arpit\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870 in run
File "C:\Users\Arpit\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932 in _bootstrap_inner
File "C:\Users\Arpit\AppData\Local\Programs\Python\Python38\lib\threading.py", line 890 in _bootstrap
Current thread 0x00001850 (most recent call first):
<no Python frame>
Process finished with exit code 3
解决方案
如果你没有任何限制,你可以试试asyncio包。
有一个异步包aioconsole
,它允许在异步执行其他任务的同时等待用户输入。
为了安装这个包,请运行:pip install aioconsole
以下代码将等待用户输入 30 秒。如果用户此时没有输入任何内容,它将继续 ( raise asyncio.TimeoutError
) 并将值设置为默认值。
import asyncio
import aioconsole
async def main(main_loop):
t = main_loop.create_task(aioconsole.ainput())
try:
await asyncio.wait_for(t, timeout=30)
value = t.result()
except asyncio.TimeoutError as _:
value = "default value"
print(value)
return value
if __name__ == '__main__':
l = asyncio.get_event_loop()
value = l.run_until_complete(main(l))
l.close()
关于你的代码,我已经尝试过了,它对我有用,只是做了一些小的改动:
from func_timeout import func_timeout, FunctionTimedOut
def doit():
value = input("enter")
return value # Need to return the value.
try:
value = func_timeout(5, doit) # Set the return value to the same variable name
except FunctionTimedOut as _:
value = "default value"
print(value)
推荐阅读
- spring - 从未在 Spring Cloud 上添加 StateStore
- swift - 使用 swift 和 firestore 数据库未显示用户个人资料信息
- excel - 如何使用VBA检查excel表中的一行是否具有某些值
- google-app-engine - App Engine 内部 apppot 服务帐号已被删除。无法部署应用
- swift - 试图以渐变的方式改变背景颜色
- flutter - Flutter Web:如何压缩图像/文件?
- chef-infra - 如何避免厨师独奏将文件从站点食谱复制到食谱文件夹?
- python - Geopandas每行不同的crs?
- python - 使用 python 打开终端并在 docker 中运行命令
- javascript - 在 Blazor 服务器端中,如何检测用户是否尝试离开当前页面