# encoding: utf-8 import asyncio import requests import functools url = "http://ip.zxinc.org/api.php" params_list = [] # 存放全部要查詢的參數 with open("IPv6.txt", 'r', encoding='utf-8') as f: for ip in f: ip = ip.strip() payload = {"type": "json", "ip": ip} params_list.append(payload) def save_result(res): # task回調函數 print(res) params, response = res.result() # 這就是get_ip_location函數的返回值,經過異步任務的result函數獲取 if response.status_code == 500: with open("save_result22.txt", "a+", encoding="utf-8") as f1: f1.write(params["ip"] + " = 地址有誤" + "\n") else: result = response.json() country = result["data"]["country"] with open("save_result22.txt", "a+", encoding="utf-8") as f1: f1.write(params["ip"] + " = " + country + "\n") async def get_ip_location(param): # 發送get請求 print("start ", param) # param = {"type": "json", "ip": "1.1.1.1"} param是requests.get的參數 loop = asyncio.get_event_loop() try: # 要使用await, 必須將第三方包轉爲awaitable對象 response = await loop.run_in_executor(None, functools.partial(requests.get, url=url, params=param)) return param, response except Exception as e: return param, e tasks = [] for param in params_list: task = asyncio.ensure_future(get_ip_location(param)) # 1.建立異步任務 task.add_done_callback(save_result) # 2.給任務添加回調函數 tasks.append(task) loop = asyncio.get_event_loop() # 3.建立事件循環 loop.run_until_complete(asyncio.wait(tasks)) # 4.執行全部異步任務