Web scanner 4
디렉터리 스캔 기능을 구현하면서 스캔 속도가 너무 느린 문제를 해결하기 위해 찾아 보던 중
비동기 방식에 대해 알게되었다.
절차적 언어인 파이썬은 작업이 순차적으로 실행되는 방식이다.
즉, 한 작업이 끝나야 다음 작업이 실행되고 이러한 동작 방식은 직관적이고 이해하기 쉬운 장점이 있다.
동기 프로그래밍은 일반적으로 순차적인 작업을 수행하는 경우에 적합하다
-
비동기 프로그래밍은 작업이 독립적으로 실행되는 방식으로,
단일 스레드 작업을 병렬로 처리하도록 만들어 상당한 속도 향상을 이끌어낼 수 있다.
주로 I/O 작업이나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 적합하다.
-
파이썬에서는 asyncio 라이브러리를 사용하여 구현할 수 있다.
-
다음과 같이 동기 함수를 구현했을 때,
1
2
def do_test():
return 'example'
def 키워드 앞에 async 키워드를 붙이면 비동기 함수가 되며, 이러한 함수를 코루틴(coroutine)이라고 한다.
1
2
async def do_test():
return 'example'
비동기 함수는 async로 선언된 다른 비동기 함수 내에서 await 키워드를 붙여서 호출해야 한다.
1
2
async def main_test():
await do_test()
async로 선언되지 않은 일반 동기 함수 내에서 비동기 함수를 호출하려면 이벤트 루프를 이용하거나 asyncio.run을 이용한다.
1
2
3
loop = asyncio.get_event_loop()
loop.run_until_complete(main_test())
loop.close()
1
asyncio.run(main_test())
이렇게 해서 일단 구현된 상태를 깃헙에 올렸다.
Link : https://github.com/R4uzN/clevsca
앞으로 천천히 개선할 사항
스캔 기능 멈춤 - 스캔 목록이 너무 많아서 오래 걸리기 때문에 멈추는 기능이 필요함
스캔 상황 표시 - progressbar로 진행 상황을 표시할 필요가 있음
CLI로 사용 가능하도록 구현