>  기사  >  백엔드 개발  >  프로그램 동시성과 실행 효율성을 향상시키기 위해 Python의 비동기 및 예약 작업을 어떻게 사용합니까?

프로그램 동시성과 실행 효율성을 향상시키기 위해 Python의 비동기 및 예약 작업을 어떻게 사용합니까?

WBOY
WBOY앞으로
2023-05-09 17:25:161082검색

비동기 작업 및 예약 작업

웹 애플리케이션의 일부 작업의 경우 완료하는 데 시간이 오래 걸리거나 실행 시간을 확인할 수 없습니다. 이러한 작업의 경우 사용자가 서버가 요청을 수신했다는 사실만 알고 요청의 실행 결과를 즉시 얻을 필요가 없다면 이를 비동기적으로 처리할 수 있습니다. 웹 사이트 성능을 최적화하기 위해 캐시를 사용하는 것이 첫 번째로 중요한 것이라면, 시간이 걸리거나 실행 시간이 불확실한 작업을 비동기화하는 것은 웹 사이트 성능을 최적화하기 위해 두 번째로 중요한 것입니다. 간단히 말해서, 연기할 수 있는 일은 즉시 수행해서는 안 됩니다.

이전 장에서는 문자 메시지 보내기와 클라우드 저장소에 파일 업로드를 예로 들었습니다. 이 두 작업 중 전자는 시간이 불확실한 작업(호출자로서 타사 플랫폼의 응답 시간을 확인할 수 없기 때문에)이고, 후자는 시간이 많이 걸리는 작업(파일이 크거나 타사 플랫폼이 불안정하면 업로드하는 데 시간이 오래 걸릴 수 있습니다.) 분명히 두 작업 모두 비동기식일 수 있습니다.

Python 프로젝트에서는 멀티스레딩을 사용하거나 타사 라이브러리 Celery를 사용하여 비동기 처리를 달성할 수 있습니다.

Celery를 사용하여 비동기화 달성

Celery는 비동기 작업 처리를 쉽게 완료할 수 있는 Python 비동기 작업 대기열/메시지 대기열입니다. Celery를 사용하면 단일 프로세스, 다중 프로세스 또는 다중 호스트일 수 있는 여러 작업 실행자에 작업을 배포할 수 있습니다. Celery는 작업 우선순위, 작업 결과 저장, 작업 재시도 및 기타 기능도 지원합니다.

Celery를 사용하여 비동기화를 구현하려면 다음 단계가 필요합니다.

Celery 설치

pip install celery

프로젝트에서 Celery 애플리케이션 만들기

from celery import Celery
app = Celery('tasks', broker='pyamqp://guest@localhost//')

작업 정의

@app.task
def add(x, y):
    return x + y

프로젝트에서 작업 호출

result = add.delay(4, 4)
print(result.get(timeout=1))

멀티 사용 -threading 비동기화 구현

Python의 threading 모듈을 사용하여 멀티 스레드를 만들 수 있습니다. 멀티스레딩을 사용하면 시간이 많이 걸리는 작업을 메인 스레드의 실행에 영향을 주지 않고 새 스레드에서 실행할 수 있습니다. threading 模块可以用来创建多线程。使用多线程可以将耗时的任务放在新线程中执行,从而不会影响主线程的执行。

使用多线程实现异步化需要以下步骤:

导入 threading 模块

import threading

定义一个函数作为任务

def task():
    print('Hello from task')

创建一个新线程并启动它

t = threading.Thread(target=task)
t.start()

定时任务

有些任务需要在特定的时间执行,这时候我们需要使用定时任务。Python 中有多个第三方库可以用来实现定时任务,如 scheduleAPScheduler 等。下面以 APScheduler 为例来讲解如何实现定时任务。

使用 APScheduler 实现定时任务需要以下步骤:

安装 APScheduler

pip install apscheduler

导入 APScheduler 模块

from apscheduler.schedulers.blocking import BlockingScheduler

创建一个 BlockingScheduler 实例并添加任务

def task():
    print('Hello from task')
scheduler = BlockingScheduler()
scheduler.add_job(task, 'interval', seconds=5)
scheduler.start()

上述代码会每隔 5 秒执行一次 task 函数。

Celery和多线程的比较

虽然 Celery 和多线程都可以实现异步化处理,但是它们之间存在一些差异和优缺点。

Celery的优缺点

优点:

  • 可以将任务分发到多个任务执行者中,从而实现任务的负载均衡,提高任务处理的效率。

  • 支持任务的优先级、任务结果的保存、任务的重试等功能。

  • 支持多种消息传输协议,如 AMQP、Redis、RabbitMQ 等。

  • 可以方便地集成到 Django、Flask 等 Web 框架中。

缺点:

  • 安装和配置过程可能会比较繁琐。

  • 可能会增加系统的复杂性。

多线程的优缺点

优点:

  • 实现起来比较简单,不需要安装额外的库。

  • 可以在本地机器上快速地完成任务处理。

缺点:

  • 不能将任务分发到多个任务执行者中,从而无法实现任务的负载均衡。

  • 无法方便地实现任务的优先级、任务结果的保存、任务的重试等功能。

  • 可能会导致系统的性能下降,因为多线程的并发性能有限。

定时任务的选择

在 Python 中,有多个第三方库可以用来实现定时任务,如 scheduleAPScheduler 等。这些库都有各自的优缺点,我们可以根据具体需求选择合适的库来实现定时任务。

schedule库

  • 简单易用,只需要调用 schedule

    멀티스레딩을 사용하여 비동기화를 구현하려면 다음 단계가 필요합니다.
  • threading 모듈 가져오기

  • 스레딩 가져오기

함수를 작업으로 정의
    rrreee
  • 새 스레드를 만들고 시작

    rrreee

    예약된 작업
  • 일부 작업은 특정 시간에 실행되어야 합니다. 이때 예약된 작업을 사용해야 합니다. Python에는 schedule, APScheduler 등과 같이 예약된 작업을 구현하는 데 사용할 수 있는 여러 타사 라이브러리가 있습니다. 예약된 작업을 구현하는 방법을 설명하기 위해 APScheduler를 예로 들어 보겠습니다.

    APScheduler를 사용하여 예약된 작업을 구현하려면 다음 단계가 필요합니다. 🎜🎜APScheduler 설치🎜🎜🎜pip install apscheduler🎜🎜🎜APScheduler 가져오기 module🎜rrreee 🎜BlockingScheduler 인스턴스 생성 및 작업 추가🎜rrreee🎜위 코드는 5초마다 task 함수를 실행합니다. 🎜🎜셀러리와 멀티스레딩의 비교🎜🎜셀러리와 멀티스레딩 모두 비동기 처리를 구현할 수 있지만 둘 사이에는 몇 가지 차이점과 장점, 단점이 있습니다. 🎜🎜Celery의 장점과 단점🎜🎜장점: 🎜🎜🎜🎜작업을 여러 작업 실행자에게 분산하여 작업 로드 밸런싱을 달성하고 작업 처리 효율성을 향상시킬 수 있습니다. 🎜🎜🎜🎜작업 우선순위, 작업 결과 저장, 작업 재시도 및 기타 기능을 지원합니다. 🎜🎜🎜🎜AMQP, Redis, RabbitMQ 등과 같은 여러 메시지 전송 프로토콜을 지원합니다. 🎜🎜🎜🎜Django 및 Flask와 같은 웹 프레임워크에 쉽게 통합될 수 있습니다. 🎜🎜🎜🎜단점: 🎜🎜🎜🎜설치 및 구성 프로세스가 번거로울 수 있습니다. 🎜🎜🎜🎜 시스템 복잡성이 증가할 수 있습니다. 🎜🎜🎜🎜멀티스레딩의 장점과 단점🎜🎜장점: 🎜🎜🎜🎜구현이 비교적 간단하고 추가 라이브러리를 설치할 필요가 없습니다. 🎜🎜🎜🎜로컬 머신에서 신속하게 작업 처리를 완료할 수 있습니다. 🎜🎜🎜🎜단점: 🎜🎜🎜🎜작업을 여러 작업 실행자에게 배포할 수 없으므로 작업의 로드 밸런싱을 달성할 수 없습니다. 🎜🎜🎜🎜우선순위, 작업 결과 저장, 작업 재시도 등의 작업을 편리하게 구현하는 것은 불가능합니다. 🎜🎜🎜🎜 멀티스레딩은 동시성 성능이 제한되어 있으므로 시스템 성능 저하가 발생할 수 있습니다. 🎜🎜🎜🎜예약된 작업 선택🎜🎜Python에는 schedule, APScheduler 등과 같이 예약된 작업을 구현하는 데 사용할 수 있는 여러 타사 라이브러리가 있습니다. . 이러한 라이브러리에는 고유한 장점과 단점이 있으며 특정 요구 사항에 따라 예약된 작업을 구현하는 데 적합한 라이브러리를 선택할 수 있습니다. 🎜🎜일정 라이브러리🎜🎜🎜🎜는 간단하고 사용하기 쉽습니다. 예약된 작업을 구현하려면 schedule 함수만 호출하면 됩니다. 🎜🎜🎜🎜 작업의 로드 밸런싱과 작업의 동시 실행을 달성할 수 없습니다. 🎜🎜🎜🎜APScheduler 라이브러리🎜🎜🎜🎜는 BlockingScheduler, BackgroundScheduler, AsyncIOScheduler 등과 같은 여러 스케줄러를 지원합니다. 🎜🎜🎜🎜날짜, 간격, cron, Interval_from_last 등과 같은 여러 트리거를 지원합니다. 🎜
  • 작업 동시 실행 및 로드 밸런싱을 지원합니다.

  • Django 및 Flask와 같은 웹 프레임워크에 쉽게 통합될 수 있습니다.

위 내용은 프로그램 동시성과 실행 효율성을 향상시키기 위해 Python의 비동기 및 예약 작업을 어떻게 사용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제