반환 된 json 데이터를 기반으로 항목 위치를 가져 오는 URL 범위를 반복하는 스크립트가 있습니다. 그러나 스크립트는 실행하는 데 60 분이 걸리지 만 json 데이터로드를 기다리는 동안 (cprofile 당) 55 분이 소요됩니다.파이썬 루프를 사용한 멀티 스레딩/멀티 프로세싱
속도를 높이기 위해 한 번에 여러 POST 요청을 실행하려면 멀티 스레드하고 싶습니다. 처음에는이 작업을 수행하기 위해 URL 범위를 두 개로 나눕니다. 내가 멈추고있는 곳은 멀티 쓰레딩이나 asyncio를 구현하는 방법이다.
몸매는 여전 하구나 코드 :
import asyncio
import aiohttp
# i am not recommend to use globals
results = dict()
url = "https://www.website.com/store/ajax/search"
query = "store={}&size=18&query=17360031"
# this is default url opener got from aiohttp documentation
async def open_url(store, loop=None):
async with aiohttp.ClientSession(loop=loop) as session:
async with session.post(url, data={'searchQuery': query.format(store)}) as resp:
return await resp.json(), store
async def processing(loop=None):
# U need to use 'global' keyworld if U wan't to write to global variables
global results
# one of the simplest ways to parallelize requests, is to init Future, and when data will be ready save it to global
tasks = [open_url(store, loop=event_loop) for store in range(0, 5)]
for coro in asyncio.as_completed(tasks, loop=loop):
try:
data, store = await coro
results[store] = data['searchResults']['results'][0]['location']['aisle']
except (IndexError, KeyError):
continue
if __name__ == '__main__':
event_loop = asyncio.new_event_loop()
event_loop.run_until_complete(processing(loop=event_loop))
# Print Results
for store, data in results.items():
print(store, data)
JSON : JSON 데이터가 검색 될 때까지
이{u'count': 1,
u'results': [{u'department': {u'name': u'Home', u'storeDeptId': -1},
u'location': {u'aisle': [A], u'detailed': [A.536]},
u'score': u'0.507073'}],
u'totalCount': 1}
감사합니다. 비동기 적으로 실행하는 것이 이상적 일 것입니다. grequests에 제공된 예제를 살펴 보았지만 특별히 URL 목록을 정의합니다. 위의 코드를 적용하는 방법을 놓친거야? 또한 grerequests.get 대신 grequests.post를 사용합니까? –