Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用libpq执行异步查询_C_Postgresql_Libpq - Fatal编程技术网

C 如何使用libpq执行异步查询

C 如何使用libpq执行异步查询,c,postgresql,libpq,C,Postgresql,Libpq,我希望以非阻塞方式使用libpq执行SQL查询。 因此,我希望在查询执行完毕时收到通知 据我所知,如果我使用异步api,libpq支持这一点 使用PQsendQuery功能,我可以将查询发送到后端,使用PQgetResult功能,我可以检索结果 我多次调用PQsendQuery函数,无需等待 前一个要完成 现在我有以下问题: 我如何将稍后将要提取的结果与之关联 PQgetResult到相应的查询 是否有使用回调而不是PQgetResult的方法 是否有方法在事件循环(例如libevent)中运

我希望以非阻塞方式使用libpq执行SQL查询。 因此,我希望在查询执行完毕时收到通知

据我所知,如果我使用异步api,libpq支持这一点

使用
PQsendQuery
功能,我可以将查询发送到后端,使用
PQgetResult
功能,我可以检索结果

我多次调用
PQsendQuery
函数,无需等待 前一个要完成

现在我有以下问题:

  • 我如何将稍后将要提取的结果与之关联
    PQgetResult
    到相应的查询
  • 是否有使用回调而不是PQgetResult的方法
  • 是否有方法在事件循环(例如libevent)中运行此操作

您在这里误解了:
PQsendQuery()
发送一个异步查询,这意味着命令在结果可用之前不会阻塞。但是,在读取所有结果之前,您不能再次调用
PQsendQuery()

从手册页:

成功调用PQsendQuery后,调用PQgetResult一次或多次以获取结果PQsendQuery在PQgetResult返回空指针(指示命令已完成)之前,不得再次调用(在同一连接上)

如手册页所示,您必须打开多个连接才能运行多个并发查询。然后,不同的结果与不同的数据库句柄相关联

PostgreSQLc异步io api不提供回调机制;然而,这并不是很难建立自己。可以使用libevent,因为您可以使用
PQsocket()
检索套接字文件描述符。然而,需要相当多的胶水才能使它工作