运行时错误:解释器关闭后无法安排新的 future

问题描述 投票:0回答:6

我正在电报中编写Python机器人,但我有一个错误未解决,错误在时间表中

Traceback (most recent call last):
  File "C:\Users\vini6\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\apscheduler\schedulers\base.py", line 979, in _process_jobs
    executor.submit_job(job, run_times)
  File "C:\Users\vini6\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\apscheduler\executors\base.py", line 71, in submit_job
    self._do_submit_job(job, run_times)
  File "C:\Users\vini6\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\apscheduler\executors\pool.py", line 28, in _do_submit_job
    f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2544.0_x64__qbz5n2kfra8p0\lib\concurrent\futures\thread.py", line 169, in submit
    raise RuntimeError('cannot schedule new futures after '
RuntimeError: cannot schedule new futures after interpreter shutdown
python windows telegram apscheduler
6个回答
13
投票

如果您使用 python-telegram-bot,您可能会在

updater.idle()
 之后错过 
updater.start_polling()

调用

我在here报告了一个错误,并得到了这个解决方案作为回复,它为我解决了这个问题。我有完全相同的错误消息,尽管这里是不同的包。因此,在搜索完上述错误消息后,将其留给来到这里的人们。


9
投票

这是 python 3.9.9 的错误或其他问题。我也遇到过这个问题。但它在 python 3.7 和 python 3.8 上运行良好。不确定其他 python3.9.x 是否可以工作

2022/02/11更新,从python3.9到python 3.10都存在这个问题


3
投票

如果您的代码在没有阻塞循环的情况下结束,您可能会遇到此问题。 例如,在你的 main.py 中:

# code start
my_function_submitting_tasks_without_waiting()
# end of file

相反,你可以做类似的事情

# code start
my_function_submitting_tasks_without_waiting()
while True:
  pass
# end of file

但是当然,您可以在主类中使用“while not self._signal_stop:”来代替“while True”


3
投票

嗯,截至 2022 年 6 月 28 日,我遇到了同样的问题,并在搜索时降落在这里。 经过一番尝试和错误后,我找到了一些目前对我有用的解决方法。

解决方案1(技巧)

我们需要的是停止程序退出。所以在最后添加一些停顿对我来说很有效。这里的示例是使用 BackgroundScheduler 但任何非阻塞调度程序都将采用相同的方法。

import pause
from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

# your code goes here

# start scheduler
scheduler.start()

# add pause in main
pause.days(1) # or it can anything as per your need

解决方案2

使用 BlockingScheduler 而不是 BackgroundScheduler

from apscheduler.schedulers.blocking import BlockingScheduler

scheduler = BlockingScheduler()

# your code goes here

scheduler.start()

0
投票

关闭调度程序时遇到同样的问题,

.shutdown(wait=False)
工作正常。

c = 0
def tick():
    global c
    print(c)
    print('Tick! The time is: %s' %
          datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    # sleep(5)
    print('After sleep! The time is: %s' %
          datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    c += 1
    if c == 3:
        # sched.remove_job('my_job_id')
        sched.shutdown(wait=False)


def main():
    sched.add_job(tick, 'interval', seconds=1,
                  next_run_time=datetime.now(),  # start immediately
                  id='my_job_id')
    sched.print_jobs()
    sched.start()

0
投票

正如其他答案所建议的,这可能是因为在启动线程的入口点函数末尾没有阻塞循环。请参阅以下代码片段以获得一些指导。我也在这里处理

KeyboardInterrupt
SystemExit

try:
    # Keep the main program running (or do other work)
    while True:
        time.sleep(1)
except (KeyboardInterrupt, SystemExit):
    # Optionally do cleanup or handle program exit
    pass

假设,如果您需要使用此代码片段触发线程的远程拆卸,您可以使用

threading.Event
对象,但这有点超出了您所要求的范围(但这将是最佳实践).

© www.soinside.com 2019 - 2024. All rights reserved.