使用带有 asyncpg db 的 apscheduler 作为作业存储:错误 MissingGreenlet

如何解决使用带有 asyncpg db 的 apscheduler 作为作业存储:错误 MissingGreenlet

我正在尝试通过 asyncpg 连接将 Apscheduler 与 postgresql 数据库一起使用。我认为它会起作用,因为 asyncpg 支持 sqlalchemy ref。但是,是的,它不起作用。更糟糕的是,我不明白错误信息,所以我什至不知道该用谷歌搜索什么。

import asyncio
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.jobstores.sqlalchemy import sqlAlchemyJobStore

def simple_job():
    print('This was an easy job!')

scheduler = AsyncIOScheduler()
jobstore = sqlAlchemyJobStore(url='postgresql+asyncpg://user:password@localhost:5432/public')
scheduler.add_jobstore(jobstore)
# schedule a simple job
scheduler.add_job(simple_job,'cron',second='15',id='heartbeat',coalesce=True,misfire_grace_time=5,replace_existing=True)
scheduler.start()

版本:

python 3.7
APScheduler==3.7.0
asyncpg==0.22.0
sqlAlchemy==1.4.3

错误信息和回溯:

Traceback (most recent call last):
  File "C:/Users/d/PycharmProjects/teamutils/utils/automation.py",line 320,in <module>
    scheduler.start()
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\apscheduler\schedulers\asyncio.py",line 45,in start
    super(AsyncIOScheduler,self).start(paused)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\apscheduler\schedulers\base.py",line 163,in start
    store.start(self,alias)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\apscheduler\jobstores\sqlalchemy.py",line 68,in start
    self.jobs_t.create(self.engine,True)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\sql\schema.py",line 940,in create
    bind._run_ddl_visitor(ddl.SchemaGenerator,self,checkfirst=checkfirst)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\base.py",line 2979,in _run_ddl_visitor
    with self.begin() as conn:
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\base.py",line 2895,in begin
    conn = self.connect(close_with_result=close_with_result)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\base.py",line 3067,in connect
    return self._connection_cls(self,close_with_result=close_with_result)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\base.py",line 91,in __init__
    else engine.raw_connection()
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\base.py",line 3146,in raw_connection
    return self._wrap_pool_connect(self.pool.connect,_connection)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\base.py",line 3113,in _wrap_pool_connect
    return fn()
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\base.py",line 301,in connect
    return _ConnectionFairy._checkout(self)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\base.py",line 755,in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\base.py",line 419,in checkout
    rec = pool._do_get()
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\impl.py",line 145,in _do_get
    self._dec_overflow()
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\util\langhelpers.py",line 72,in __exit__
    with_traceback=exc_tb,File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\util\compat.py",line 198,in raise_
    raise exception
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\impl.py",line 142,in _do_get
    return self._create_connection()
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\base.py",line 247,in _create_connection
    return _ConnectionRecord(self)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\base.py",line 362,in __init__
    self.__connect(first_connect_check=True)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\base.py",line 605,in __connect
    pool.logger.debug("Error on connect(): %s",e)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\util\langhelpers.py",in raise_
    raise exception
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\pool\base.py",line 599,in __connect
    connection = pool._invoke_creator(self)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\create.py",line 578,in connect
    return dialect.connect(*cargs,**cparams)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\engine\default.py",line 548,in connect
    return self.dbapi.connect(*cargs,**cparams)
  File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\dialects\postgresql\asyncpg.py",line 744,in connect
    await_only(self.asyncpg.connect(*arg,**kw)),File "C:\Users\d\PycharmProjects\teamutils\venv\lib\site-packages\sqlalchemy\util\_concurrency_py3k.py",line 48,in await_only
    "greenlet_spawn has not been called; can't call await_() here. "
sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called; can't call await_() here. Was IO attempted in an unexpected place? (Background on this error at: http://sqlalche.me/e/14/xd2s)
sys:1: RuntimeWarning: coroutine 'connect' was never awaited

我查找了提供的链接,但没有了解它。所以如果有人能告诉我发生了什么,那将是很好的,这样我就可以自己寻找解决方案。 (解决方案也可以,当然xD)

抱歉这个“开放性”问题,但我的理解太糟糕了,我不知道该问什么。

解决方法

我认为问题出在 ApScheduler 中。

发生的事情是 scheduler.start() 将尝试在您的数据库中创建作业表。但是由于您的数据库 url 被指定为 +asyncpg 并且当 ApScheduler 尝试创建表时没有运行异步协程(即:async def)。因此,“从未等待过协程‘连接’”错误。

阅读 ApScheduler 代码后,我认为“与 asyncio 集成”有点误导 - 特别是 scheduler 可以运行 asyncio,但 JobStore 本身没有提供 asyncio 数据库连接。 >

您可以通过删除与 ApScheduler 一起使用的连接 url 中的 +asyncpg 来使其工作。

请注意,仍然可以通过单独的 asyncpg 连接在作业函数中使用异步数据库调用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?