【问题标题】:Fatal Python error: could not acquire lock for <_io.BufferedReader name='<stdin>'> at interpreter shutdown, possibly due to daemon threads致命的 Python 错误:在解释器关闭时无法获取 <_io.BufferedReader name='<stdin>'> 的锁,可能是由于守护线程
【发布时间】:2020-05-02 06:11:44
【问题描述】:

我想写一个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

【问题讨论】:

  • Traceback(最近一次调用最后一次):文件“C:/Users/Arpit/PycharmProjects/Complete Test/test.py”,第 7 行,在 i, o, e = select。 select( [sys.stdin],[],[], 30 ) OSError: [WinError 10038] 尝试对非套接字的操作进行操作

标签: python


【解决方案1】:

如果您没有任何限制,请尝试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)

【讨论】:

  • 谢谢,第一个代码对我有用,但第二个代码显示此错误:致命的 Python 错误:在解释器关闭时无法获取 <_io.bufferedreader name="<stdin>"> 的锁定,可能是由于守护线程 Python 运行时状态:finalizing (tstate=000000000045AF50)
  • 顺便说一下我的平台是windows 7
  • 我建议使用第一种方法(代码),因为它使用内置的python3 功能/能力。关于秒代码,请尝试阅读stackoverflow.com/questions/45267439/… 它可能会对您有所帮助。
  • 你能告诉我如何在这个函数之外调用“value”变量:“async def main(main_loop):”
  • 我编辑了代码,说明如何从 main 函数返回 value 参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多