보뇨 다이어리

동시성 구현 본문

컴퓨터 관련/Python 정보

동시성 구현

보뇨 2021. 3. 7. 11:56
반응형

코드로만 작성해보고 하다보니 코드로 설명!
자바스크립트에서는 Promise 라는게 있어서 잘만 사용했는데 파이썬은 어떻게..? 라는 생각이 들어서 찾아봤다
생각보다 사용방법은 간단했고 사실 같기도하다..

필요한 부분만 주석으로 설명을 넣었다!

import time
import threading
from concurrent.futures import Future
import asyncio

def network_request(number):
    time.sleep(1.0)
    return {"success": True, "result": number ** 2}

def fetch_square(number):
    response = network_request(number)
    if response["success"]:
        print("Result is {}".format(response["result"]))

def wait_and_print(msg):
    time.sleep(1.0)
    print(msg)

# threading 블로킹없이 대기 가능 
def wait_and_print_async(msg):
    def callback():
        print(msg)
    timer = threading.Timer(1.0, callback)
    timer.start()

# 콜백 함수를 받도록 수정 
def network_request_async(number, on_done):
    def timer_done():
        on_done({"success": True, "result": number ** 2})
    timer = threading.Timer(1.0, timer_done)
    timer.start()

# Future 비동기 호출의 결과를 추적하는데 사용할수있는 패턴
# set_result 를 하면 Future.result 할때 값이 나오게 되고
# add_done_callback 를 통해 콜백 추가 가능 
def test_future():
    fut = Future()
    fut.add_done_callback(lambda future: print(future.result(), flush=True))
    fut.set_result("Hello")

# 기본적으로 사용되는 프레임워크인 asyncio 
def test_asyncio():
    loop = asyncio.get_event_loop()
    def asyncio_callback():
        print("Hello, asyncio")
        loop.stop()
    loop.call_later(1.0, asyncio_callback)
    loop.run_forever()

# asyncio 에 있는 async, await 을 통해 간단하게 구현 가능 
async def wait_and_print_async_await():
    await asyncio.sleep(1)
    print("Message: Good!")


if __name__ == '__main__':
    network_request_async(1, lambda value: print(value))
    network_request_async(2, lambda value: print(value))
    test_future()
    test_asyncio()

    loop = asyncio.get_event_loop()
    loop.run_until_complete(wait_and_print_async_await())
반응형