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
我正在使用这个库,它是 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