비동기 프로그래밍 시작하기

일반적으로 애플리케이션을 코딩할 때 한 번에 코드 덩어리가 실행됩니다. 따라서 코드에 일정 수의 작업이 포함되어 있으면 각 작업이 한 번에 하나씩 컴파일됩니다. 이러한 형태의 프로그래밍을 동기식 프로그래밍이라고 합니다.

그러나 대부분의 컴퓨터 시스템에는 종종 여러 작업을 함께 실행할 수 있는 다중 프로세서가 장착되어 있다고 생각하지 마십시오. 그렇다면 한 번에 하나의 작업을 실행하는 요점은 무엇입니까?

비동기 프로그래밍



최신 소프트웨어 개발은 ​​동시에 여러 작업을 수행하는 데 중점을 두고 있으며 컴퓨터의 잠재력을 최대한 활용하여 최대한 많은 시간을 절약합니다. 이러한 형태의 프로그래밍을 비동기 프로그래밍이라고 합니다.



어떻게 하죠?



비동기 프로그래밍에서 프로그램은 여러 스레드에 대한 처리를 공유합니다. 스레드는 프로그램이 작업을 완료하는 데 사용할 수 있는 단일 프로세스입니다. 각 스레드는 한 번에 하나의 작업만 수행할 수 있습니다.

// single thread application.
Thread: Task 1 -> Task 2 -> Task 3 -> Task 4 -> END


따라서 위의 프로그램에 이중 스레드를 사용하면 처리 시간을 거의 절반으로 줄일 수 있습니다.

// Multi threaded application.
Thread A: Task 1 -> Task 3 -> END
Thread B: Task 2 -> Task 4 -> END


Python, JavaScript와 같은 대부분의 프로그래밍 언어는 오래되었으며 동기식으로 작동하도록 구축된 단일 스레드입니다. 나중에 그들은 이러한 문제를 해결하고 일부 처리를 다른 스레드로 보낼 수 있는 도구를 얻었습니다.

GO, Rust 등과 같은 새로운 프로그래밍 언어는 기본적으로 멀티스레딩을 사용합니다.

비동기 웹 애플리케이션



"Over 50% of mobile users abandons websites that take longer than three seconds to load." - Research by Google



일반적인 예제를 통해 웹 앱에서 비동기 프로그래밍을 적용하는 방법에 대해 논의해 보겠습니다. 메일링 응용 프로그램이 있고 작업이 5개의 이메일을 보내는 것이라고 가정합니다.

하나의 메일을 처리하는 데 2초가 걸린다고 가정하면 이 작업에는 총 10초가 소요됩니다. 이것은 사용자에게 좋지 않습니다. 대부분의 사용자는 작업 완료를 위해 10초를 기다리지 않을 것입니다.

이것을 비동기적으로 하려고 하면 어떻게 될까요?



다른 스레드에서 작업을 완료하기 위해 Django-celery 패키지를 사용하는 Django 기반 코드베이스를 공유하고 있습니다.

Note: If you're not familiar with python and Django, no worries, just take a look at the codebase to know what's happening and you can apply similar functionality in your applications.



이 작업을 동기식으로 코딩하면 다음이 수행됩니다.

# proj/urls.py
urlpatterns = [
    path('', index),
]

#proj/views.py
def index(request):
    curr_time = datetime.now()
    print("Process initiated at", curr_time)
    send_mail()    # Send 1st mail
    send_mail()    # Send 2nd mail
    send_mail()    # Send 3rd mail
    send_mail()    # Send 4th mail
    send_mail()    # Send 5th mail

    done_time = datetime.now()
    print("Process completed at", done_time)
    total_time = done_time-curr_time
    print("Total time for sending 5 mails:", total_time)

    return HttpResponse("Mails, sent successfully.")


출력을 다음과 같이 반환합니다.

Process initiated at 2021-06-09 09:01:58.158870
Process completed at 2021-06-09 09:02:08.179977
Total time for sending 5 mails: 0:00:10.021107


Notice how our function took 10.021107s to execute.



이제 대부분의 시간을 소비하는 코드의 일부는 send_mail()입니다. 생각해 보면 이 프로세스에 대해 별도의 스레드를 만들어 실행할 수 있습니다. 이것은 메인 스레드가 즉시 실행된다는 것입니다. 이를 통해 사용자는 자신의 메일이 전송 중임을 알 수 있으며 다른 작업을 계속할 수 있습니다.



색인 기능을 편집하고 celery 을 사용하여 이러한 메일을 비동기적으로 전송해 보겠습니다.

따라서 리팩토링된 기능은 다음과 같습니다.

# proj/urls.py
urlpatterns = [
    path('', index),
]

#proj/views.py
def index(request):
    curr_time = datetime.now()
    print("Process initiated at", curr_time)
    send_mail.delay()    # Send 1st mail with celery
    send_mail.delay()    # Send 2nd mail with celery
    send_mail.delay()    # Send 3rd mail with celery
    send_mail.delay()    # Send 4th mail with celery
    send_mail.delay()    # Send 5th mail with celery

    done_time = datetime.now()
    print("Process initiated at", done_time)
    total_time = done_time-curr_time
    print("Total time for sending 5 mails:", total_time)

    return HttpResponse("Mails, sent successfully.")



출력을 다음과 같이 반환합니다.

Process initiated at 2021-06-09 09:09:19.496051
Process initiated at 2021-06-09 09:09:19.549268
Total time for sending 5 mails: 0:00:00.053217


Notice, this time our function took only 0.053217s to execute.





이것은 다른 스레드에서 시간이 걸리는 작업을 처리하고 가능한 한 빨리 기본 스레드를 처리하기 위해 최신 웹 응용 프로그램이 개발된 방법입니다.


지금쯤이면 비동기 프로그래밍과 그 응용 프로그램에 대해 잘 이해하셨기를 바랍니다. 기사가 마음에 들면 동료들과 공유하십시오.

내가 놓친 것이 있습니까? 댓글에 적어주세요. 언제나처럼 제안은 언제나 환영합니다.

나를 찾으십시오: | GitHub |

Happy Coding.

좋은 웹페이지 즐겨찾기