未使用 Python 个请求线程调用延迟回调
Deferred callback not being called using Python requests-threads
我正在尝试使用 Python 中的请求库执行异步 HTTP 请求。我发现该库的最新版本不直接支持异步请求。为了实现它,他们提供了使用 Twisted 处理异步性的请求线程库。我尝试修改提供的示例以使用回调而不是 await/yield,但没有调用回调。
我的示例代码是:
session = AsyncSession(n=10)
def processResponse(response):
print(response)
def main():
a = session.get('https://reqres.in/api/users')
a.addCallbacks(processResponse, processResponse)
time.sleep(5)
我认为这里唯一的错误是您忘记了 运行 。
以下代码适用于我:
from twisted.internet import reactor
from requests_threads import AsyncSession
session = AsyncSession(n=10)
def processResponse(response):
print(response)
a = session.get('https://reqres.in/api/users')
a.addCallbacks(processResponse, processResponse)
reactor.run()
我怀疑没有调用回调是因为您不是 运行 Twisted 的事件循环(称为 reactor
)。删除您的睡眠功能并将其替换为 reactor.run()
.
from twisted.internet import reactor
# ...
def main():
a = session.get('https://reqres.in/api/users')
a.addCallbacks(processResponse, processResponse)
#time.sleep(5) # never use blocking functions like this w/ Twisted
reactor.run()
关键是Twisted的reactor无法重启,所以一旦你停止了事件循环(即reactor.stop()
),再次执行reactor.run()
时就会抛出异常。换句话说,你的 script/app 只会 "run once"。为了避免这个问题,我建议你使用 crochet
。这是一个使用来自 requests-thread
:
的类似示例的简单示例
import crochet
crochet.setup()
print('setup')
from twisted.internet.defer import inlineCallbacks
from requests_threads import AsyncSession
session = AsyncSession(n=100)
@crochet.run_in_reactor
@inlineCallbacks
def main(reactor):
responses = []
for i in range(10):
responses.append(session.get('http://httpbin.org/get'))
for response in responses:
r = yield response
print(r)
if __name__ == '__main__':
event = main(None)
event.wait()
并且仅供参考 requests-thread
不适用于生产系统,并且可能会发生重大变化(截至 2017 年 10 月)。该项目的最终目标是为 requests
设计一个可等待的设计模式。如果您需要生产就绪的并发请求,请考虑 grequests
或 treq
.
我正在尝试使用 Python 中的请求库执行异步 HTTP 请求。我发现该库的最新版本不直接支持异步请求。为了实现它,他们提供了使用 Twisted 处理异步性的请求线程库。我尝试修改提供的示例以使用回调而不是 await/yield,但没有调用回调。
我的示例代码是:
session = AsyncSession(n=10)
def processResponse(response):
print(response)
def main():
a = session.get('https://reqres.in/api/users')
a.addCallbacks(processResponse, processResponse)
time.sleep(5)
我认为这里唯一的错误是您忘记了 运行
以下代码适用于我:
from twisted.internet import reactor
from requests_threads import AsyncSession
session = AsyncSession(n=10)
def processResponse(response):
print(response)
a = session.get('https://reqres.in/api/users')
a.addCallbacks(processResponse, processResponse)
reactor.run()
我怀疑没有调用回调是因为您不是 运行 Twisted 的事件循环(称为 reactor
)。删除您的睡眠功能并将其替换为 reactor.run()
.
from twisted.internet import reactor
# ...
def main():
a = session.get('https://reqres.in/api/users')
a.addCallbacks(processResponse, processResponse)
#time.sleep(5) # never use blocking functions like this w/ Twisted
reactor.run()
关键是Twisted的reactor无法重启,所以一旦你停止了事件循环(即reactor.stop()
),再次执行reactor.run()
时就会抛出异常。换句话说,你的 script/app 只会 "run once"。为了避免这个问题,我建议你使用 crochet
。这是一个使用来自 requests-thread
:
import crochet
crochet.setup()
print('setup')
from twisted.internet.defer import inlineCallbacks
from requests_threads import AsyncSession
session = AsyncSession(n=100)
@crochet.run_in_reactor
@inlineCallbacks
def main(reactor):
responses = []
for i in range(10):
responses.append(session.get('http://httpbin.org/get'))
for response in responses:
r = yield response
print(r)
if __name__ == '__main__':
event = main(None)
event.wait()
并且仅供参考 requests-thread
不适用于生产系统,并且可能会发生重大变化(截至 2017 年 10 月)。该项目的最终目标是为 requests
设计一个可等待的设计模式。如果您需要生产就绪的并发请求,请考虑 grequests
或 treq
.