我正在电报中编写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-telegram-bot,您可能会在
updater.idle()
之后错过
updater.start_polling()
调用
我在here报告了一个错误,并得到了这个解决方案作为回复,它为我解决了这个问题。我有完全相同的错误消息,尽管这里是不同的包。因此,在搜索完上述错误消息后,将其留给来到这里的人们。
这是 python 3.9.9 的错误或其他问题。我也遇到过这个问题。但它在 python 3.7 和 python 3.8 上运行良好。不确定其他 python3.9.x 是否可以工作
2022/02/11更新,从python3.9到python 3.10都存在这个问题
如果您的代码在没有阻塞循环的情况下结束,您可能会遇到此问题。 例如,在你的 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”
嗯,截至 2022 年 6 月 28 日,我遇到了同样的问题,并在搜索时降落在这里。 经过一番尝试和错误后,我找到了一些目前对我有用的解决方法。
我们需要的是停止程序退出。所以在最后添加一些停顿对我来说很有效。这里的示例是使用 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
使用 BlockingScheduler 而不是 BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
# your code goes here
scheduler.start()
关闭调度程序时遇到同样的问题,
.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()
正如其他答案所建议的,这可能是因为在启动线程的入口点函数末尾没有阻塞循环。请参阅以下代码片段以获得一些指导。我也在这里处理
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
对象,但这有点超出了您所要求的范围(但这将是最佳实践).