Python 2captcha ( Twocaptcha ) 异步? (或 运行 任何同步 class 异步?)

Python 2captcha ( Twocaptcha ) asynchronously? (or running any sync class asynchronously?)

我正在使用这个库,它是 2captcha API 服务的官方 Python 包装器:https://github.com/2captcha/2captcha-python/tree/master/twocaptcha

该代码非常易于集成,但我一直无法弄清楚如何异步 运行 它。我已经尝试编辑他们的代码并将 time.sleep 的实例替换为 asyncio.sleep 但该函数仍然阻止我的事件循环。这是我用来解决验证码的代码:

import twocaptcha
from twocaptcha import TwoCaptcha

captchas = TwoCaptcha(API_KEY)

result = captchas.normal(image) # it blocks here

我也试过(现在还在)运行在这样的执行器中安装它:

await self.loop.run_in_executor(None, lambda: captchas)

但这似乎什么也没做,但我确信它正在被使用,因为它后面的代码仍然有效。我也试过将它放入 while 循环中,认为它可能需要继续执行或其他东西,但这也没有改变任何东西。如果我不使用 lambda,我会收到 TypeError 错误提示:

'TwoCaptcha' object is not callable

但是await self.loop.run_in_executor(None, captchas.normal(*args))似乎也没用。我可能在做一些愚蠢的事情,因为我还是个初学者,而且我以前从未使用过 run_in_executor

无论如何,如果有人知道我如何运行这而不阻塞我的事件循环,在此先感谢!

我解决了这个问题,所以这里是给任何发现这个的人的。

以前阻塞调用是这样的:

from twocaptcha import TwoCaptcha

solver = TwoCaptcha(API_KEY)

captcha_result = solver.normal(captcha_image) # blocking

但是可以这样运行异步:

import asyncio
import concurrent.futures
from twocaptcha import TwoCaptcha

solver = TwoCaptcha(API_KEY)

captcha_result = await captchaSolver(captcha_image) # not blocking

async def captchaSolver(image):
    loop = asyncio.get_running_loop()
    with concurrent.futures.ThreadPoolExecutor() as pool:
        result = await loop.run_in_executor(pool, lambda: solver.normal(image))
        return result