windows 运行时错误:解释程序关闭后不能安排新的future

3okqufwl  于 2023-01-31  发布在  Windows
关注(0)|答案(5)|浏览(1016)

我正在电报中对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
ee7vknir

ee7vknir1#

如果您使用的是python-telegram-bot,则可能会在updater.start_polling()之后丢失一个updater.idle()调用
我报告了一个bug here,并得到了这个解决方案的回复,它为我修复了它。我得到了非常相同的错误信息,虽然它是一个不同的包在这里。所以把这个留给来这里的人,在搜索了上面的错误信息后。

rkue9o1l

rkue9o1l2#

这是python 3.9.9的bug或者什么的。我也遇到过这个问题。但是它在python 3.7和python 3.8上运行良好。不确定是否有其他python3.9.x可以运行
2022年2月11日更新,从python3.9到python3.10存在此问题

epggiuax

epggiuax3#

如果代码结尾没有阻塞循环,您可能会遇到这个问题。例如,在www.example.com中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

6bc51xsx

6bc51xsx4#

在关闭调度程序时遇到了同样的问题,.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()
drnojrws

drnojrws5#

嗯,我已经面临了同样的问题,作为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

使用 * 阻塞调度程序 * 而不是 * 后台调度程序 *

from apscheduler.schedulers.blocking import BlockingScheduler

scheduler = BlockingScheduler()

# your code goes here

scheduler.start()

相关问题