我正在学习在 python 中使用 concurrent.futures,我想测试的函数有两个参数。我尝试使用“部分”来包含第二个参数,但没有用。我怎样才能让它发挥作用?
下面的代码对我有用:
def check_proxy(proxy,index):
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s' % proxy)
driver = webdriver.Chrome(options=chrome_options)
try:
driver.get("https://ip.oxylabs.io/")
return (f'{index}- {driver.find_element(By.TAG_NAME, "pre").text}')
except:
return (f"{index} - Bad Proxy: {proxy} was removed from list")
finally:
driver.quit()
def main():
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
list = []
for x in range (len(proxies)):
futures = executor.submit(check_proxy,proxies[x],x)
list.append(futures)
for future in concurrent.futures.as_completed(list):
print (future.result()
if __name__ == "__main__":
main()
这段代码的结果是我所期望的。显示一切正常的代理列表。
2- 104.233.XX.YY
1- 140.99.XXX.XX
0- 104.227.XX.YY
3- 45.72.XX.YYY
4- 104.227.XX.YYY
当我尝试使用 executor.map 并添加部分函数以包含第二个参数时,我的结果都是错误的。
def main():
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
results = executor.map(partial(check_proxy,proxies),range(1,len(proxies)))
for result in results:
print (result)
现在得到的结果是这些:
1 - Bad Proxy: ['104.227.XX.YY:ZZZZ', '140.99.XXX.YY:ZZZZ', '104.233.XX.YY:ZZZZ', '45.72.XX.YYY:ZZZZ', '104.227.XX.YYY:ZZZZ'] was removed from list for Access Denied
2 - Bad Proxy: ['104.227.XX.YY:ZZZZ', '140.99.XXX.YY:ZZZZ', '104.233.XX.YY:ZZZZ', '45.72.XX.YYY:ZZZZ', '104.227.XX.YYY:ZZZZ'] was removed from list for Access Denied
3 - Bad Proxy: ['104.227.XX.YY:ZZZZ', '140.99.XXX.YY:ZZZZ', '104.233.XX.YY:ZZZZ', '45.72.XX.YYY:ZZZZ', '104.227.XX.YYY:ZZZZ'] was removed from list for Access Denied
4 - Bad Proxy: ['104.227.XX.YY:ZZZZ', '140.99.XXX.YY:ZZZZ', '104.233.XX.YY:ZZZZ', '45.72.XX.YYY:ZZZZ', '104.227.XX.YYY:ZZZZ'] was removed from list for Access Denied
5 - Bad Proxy: ['104.227.XX.YY:ZZZZ', '140.99.XXX.YY:ZZZZ', '104.233.XX.YY:ZZZZ', '45.72.XX.YYY:ZZZZ', '104.227.XX.YYY:ZZZZ'] was removed from list for Access Denied
为什么会这样,我该如何解决?有没有办法使用
executor.map(partial)
将更多参数包含到我的函数中并仍然使它工作?或者使用 executor.map
并将多个参数传递给函数的任何其他方式
你能帮我理解为什么我会看到这个结果吗?我不明白部分是如何使功能同时测试所有代理的。
我不认为你想在这里使用部分,而只是:
indicies = range(1, len(proxies) + 1)
results = executor.map(check_proxy, proxies, indicies)