【发布时间】:2019-04-06 12:30:31
【问题描述】:
我正在使用这个异步项目(称为Broker - see git),代码如下:
proxies = asyncio.Queue()
broker = Broker(proxies)
tasks = asyncio.gather(broker.find(types = ['HTTPS'], strict = True, limit = 10),
self.storeProxies(proxies))
loop = asyncio.get_event_loop()
loop.run_until_complete(tasks)
其中self.storeProxies 是一个异步函数,包含
while True:
proxy = await proxies.get()
if proxy is None: break
self.proxies['http://{0}:{1}'.format(proxy.host, proxy.port)] = 1
但是,我认为它与Broker 部分无关(当然不确定)。
每次我运行此代码时,在相当随机的成功次数后,它都会以[WinError 10038] An operation was attempted on something that is not a socket 失败。然后我尝试做一些研究并最终到达this answer。但是在尝试使用此代码时,我收到此错误:
ValueError: loop argument must agree with Future
关于如何处理这个问题的任何想法?
可能有用的细节:
操作系统:Windows 10(版本 1809) Python 版本:3.7.1
根据米哈伊尔·格拉西莫夫的回答
async def storeProxies(self, proxies):
logger.info("IN IT!")
while True:
proxy = await proxies.get()
if proxy is None: break
self.proxies['http://{0}:{1}'.format(proxy.host, proxy.port)] = 1
async def getfetching(self, amount):
from proxybroker import Broker
proxies = asyncio.Queue()
broker = Broker(proxies)
return await asyncio.gather(
broker.find(
types = ['HTTP', 'HTTPS'],
strict = True,
limit = 10
),
self.storeProxies(proxies)
)
def fetchProxies(self, amount):
if os.name == 'nt':
loop = asyncio.SelectorEventLoop() # for subprocess' pipes on Windows
asyncio.set_event_loop(loop)
else:
loop = asyncio.get_event_loop()
loop.run_until_complete(self.getfetching(amount))
logger.info("FETCHING COMPLETE!!!!!!")
logger.info('Proxies: {}'.format(self.proxies))
fetchProxies 从另一个地方以一定的间隔被调用。这第一次完美运行,但随后“失败”并出现警告:
2019-04-06 21:04:21 [py.warnings] WARNING: d:\users\me\anaconda3\lib\site-packages\proxybroker\providers.py:78: DeprecationWarning: The object should be created from async function
headers=get_headers(), cookies=self._cookies, loop=self._loop
2019-04-06 21:04:21 [py.warnings] WARNING: d:\users\me\anaconda3\lib\site-packages\aiohttp\connector.py:730: DeprecationWarning: The object should be created from async function
loop=loop)
2019-04-06 21:04:21 [py.warnings] WARNING: d:\users\me\anaconda3\lib\site-packages\aiohttp\cookiejar.py:55: DeprecationWarning: The object should be created from async function
super().__init__(loop=loop)
随后出现一个看起来像无限循环的行为(硬卡在什么都不输出)。值得注意的是,在 Gerasimov(在 cmets 中)的示例中,我在全局导入 Broker 时也发生了这种情况。终于,我开始看到隧道的曙光了。
【问题讨论】:
-
在首次导入代理之前尝试调用
set_event_loop。 -
@user4815162342 请看我的更新:))
-
这仍然不是在 importing
Btoker之前。可以肯定的是,将代码移到import asyncio之后。
标签: python python-asyncio