>데이터 베이스 >Redis >Redis의 비동기 작업 처리에 대한 자세한 설명

Redis의 비동기 작업 처리에 대한 자세한 설명

王林
王林원래의
2023-06-20 08:26:531749검색

웹 애플리케이션이 계속 개발됨에 따라 비동기 작업 처리의 필요성이 점점 더 중요해지고 있습니다. 작업을 완료하기 전에 사용자가 애플리케이션을 계속 사용할 수 있는지 확인해야 하기 때문입니다. 이 경우 비동기 작업 처리를 제외하면 다중 작업 병렬 처리가 불가능하므로 비동기 작업을 처리하기 위해 일부 도구를 사용해야 하는 경우가 많으며 그중 Redis가 매우 유용한 도구입니다.

Redis는 데이터를 빠르게 저장하고 읽고 조작하는 데 사용할 수 있는 고성능 인메모리 데이터베이스입니다. 주요 용도는 캐싱 및 메시징을 구현하는 것이지만 비동기 작업을 처리하는 데에도 사용할 수 있습니다. Redis에는 대기열 처리 및 게시/구독 기능이 내장되어 있어 비동기 작업 처리에 매우 유용한 도구입니다.

이 기사에서는 Redis를 사용하여 비동기 작업 처리를 구현하는 방법을 소개합니다.

  1. Redis 연결 설정

먼저 Redis 클라이언트를 사용하여 Redis 서버와 연결을 설정해야 합니다. Redis 연결을 지원하는 모든 클라이언트를 사용할 수 있습니다. Python의 redis-py는 매우 좋은 선택입니다. redis-py를 전역적으로 설치하십시오:

pip install redis

다음으로, 다음 명령을 사용하여 Redis 연결을 설정할 수 있습니다:

import redis

redis_conn = redis.Redis(host='localhost', port=6379, db=0)

여기서는 redis_conn이라는 Redis 연결 인스턴스를 생성했습니다. 이 인스턴스는 로컬 Redis 서버(호스트)에 연결됩니다. = 'localhost'), 포트 번호는 6379(port=6379), 데이터베이스 번호 0(db=0)이 사용됩니다.

  1. Redis Queue

Redis Queue(RQ)는 Redis를 백엔드로 사용하여 분산 작업 대기열을 구현하는 Python 라이브러리입니다. RQ는 Redis의 lpush 및 rpop 명령을 기반으로 구축되었으므로 성능이 매우 좋습니다.

RQ 및 Redis 설치:

pip install rq redis
  1. 동기 작업

동기 작업에서 기본 스레드는 모든 코드를 실행하고 작업이 완료될 때까지 기다립니다. 다음은 동기화된 작업에 대한 샘플 코드입니다.

import time

def task():
    # 等待5秒
    time.sleep(5)
    print('Task complete')

print('Starting task')
task()
print('Task ended')

위의 예에서는 5초 동안 대기한 후 "작업 완료"를 출력하는 task라는 함수를 정의했습니다. 그런 다음 메인 스레드에서 이 작업을 호출하고 "Starting task"를 출력하고 5초 동안 기다린 다음 "Task done"을 출력합니다.

이 접근 방식은 단기 작업에는 효과적이지만 장기 실행 작업의 경우 애플리케이션을 사용할 수 없기 때문에 사용자는 매우 불만족스러워집니다.

이제 이 작업을 비동기 작업으로 변환하는 방법을 살펴보겠습니다.

  1. 비동기 작업

작업을 비동기 작업으로 변환한다는 개념은 해당 작업을 별도의 스레드나 프로세스에서 실행하고 메인 스레드에서 다른 코드를 계속 실행하는 것입니다. 이러한 방식으로 사용자는 작업이 백그라운드에서 수행되는 동안 계속해서 애플리케이션을 사용할 수 있습니다.

Python에서는 스레드나 프로세스를 사용하여 백그라운드 작업을 수행할 수 있습니다. 그러나 여러 작업이 실행 중인 경우 스레드 및 프로세스 수가 증가할 수 있으며 교착 상태 및 동기화 문제와 같은 문제가 발생할 수도 있습니다.

Redis를 사용하면 이러한 문제를 방지할 수 있는 대기열 구조가 내장되어 있으므로 Redis를 사용하면 이 문제를 해결할 수 있습니다. Redis에서 비동기 작업을 구현하는 기본 아이디어는 작업 대기열을 만들고 대기열에 작업을 추가하는 것입니다. 그런 다음 별도의 작업 실행기를 만들어 대기열에 있는 작업을 가져와 실행합니다.

Redis는 인메모리 데이터베이스이므로 이를 사용하여 모든 대기열 데이터를 저장할 수 있습니다. 이렇게 하면 Redis에 작업 상태를 저장할 수 있으며 작업을 처리하기 위해 스레드나 프로세스를 사용할 필요가 없습니다.

다음은 비동기 작업에 대한 샘플 코드입니다.

from rq import Queue
from redis import Redis

redis_conn = Redis()
q = Queue(connection=redis_conn)

def task():
    # 等待5秒
    time.sleep(5)
    print('Task complete')

print('Starting task')
job = q.enqueue(task)
print('Task started')

위 코드에서는 먼저 q라는 Redis 대기열을 만든 다음 task라는 함수를 정의합니다. 메인 스레드에서 작업을 호출할 때 대기열 객체의 enqueue 메서드를 사용하여 대기열에 작업을 추가합니다. 이 메서드는 대기열의 작업을 나타내는 job이라는 작업 개체를 반환합니다. 그런 다음 "Task started"를 출력하면 큐 실행기가 백그라운드에서 작업을 가져와 실행합니다.

  1. 작업 모니터링

이전 예에서는 작업 개체를 사용하여 작업 상태를 모니터링하고 결과를 검색할 수 있었습니다. 다음은 작업을 모니터링하는 방법에 대한 샘플 코드입니다.

from rq import Queue
from redis import Redis

redis_conn = Redis()
q = Queue(connection=redis_conn)

def task():
    # 等待5秒
    time.sleep(5)
    return 'Task complete'

print('Starting task')
job = q.enqueue(task)
print('Task started')

# 检查任务状态并获取结果
while job.result is None:
    print('Task still processing')
    time.sleep(1)

print('Task complete: {}'.format(job.result))

위 코드에서는 작업이 비어 있지 않을 때까지 작업의 결과 속성을 확인합니다. 그런 다음 "작업 완료:"와 작업 개체의 결과를 출력합니다.

  1. 게시/구독 사용

Redis는 게시/구독(pub/sub) 모델도 지원하므로 매우 유용한 메시징 도구입니다. 이 모델에서 게시자는 주제에 메시지를 게시하고 구독자는 주제를 구독하고 주제에 대한 모든 메시지를 받습니다.

게시/구독 모델을 사용한 구현을 설명하기 위해 비동기 작업을 예로 들어 보겠습니다.

먼저, 각 작업에 대한 고유 ID를 만들고 해당 작업을 대기열에 추가해야 합니다. 그런 다음 작업 ID를 주제에 게시합니다. 작업 실행자는 주제를 구독하고 작업 ID가 수신되면 작업을 가져와 실행합니다.

다음은 게시/구독 모델을 사용하여 비동기 작업을 구현하는 샘플 코드입니다.

from rq import Queue
from redis import Redis
import uuid

redis_conn = Redis()
q = Queue(connection=redis_conn)

# 订阅任务主题并执行任务
def worker():
    while True:
        _, job_id = redis_conn.blpop('tasks')
        job = q.fetch_job(job_id.decode('utf-8'))
        job.perform()

# 发布任务并将其ID添加到队列中
def enqueue_task():
    job = q.enqueue(task)
    redis_conn.rpush('tasks', job.id)

def task():
    # 等待5秒
    time.sleep(5)
    return 'Task complete'

print('Starting workers')
for i in range(3):
    # 创建3个工作线程
    threading.Thread(target=worker).start()

print('Enqueueing task')
enqueue_task()
print('Task enqueued')

위 코드에서는 먼저 대기열 ID에서 예약된 작업을 지속적으로 반복하고 취소하는 작업자라는 작업 실행기를 정의합니다. 작업 ID를 얻으면 fetch_job 메서드를 사용하여 작업 개체를 가져와 실행합니다.

또한 job이라는 비동기 작업을 생성하고 해당 ID를 대기열에 추가하는 enqueue_task라는 함수를 정의합니다. 그런 다음 메인 스레드에서 이 함수를 호출하고 작업 ID를 "tasks"라는 주제에 게시합니다. 작업 실행자는 작업을 가져와서 작업 ID를 받으면 실행합니다.

  1. 요약

이 글에서는 Redis를 사용하여 비동기 작업 처리를 구현하는 방법을 소개했습니다. Python에서 대기열, 게시/구독 모델 및 RQ 라이브러리를 사용하면서 작업을 비동기 모드로 변환하고 비동기 작업을 사용하여 사용자 경험 문제를 해결하는 방법을 보여주었습니다. Redis는 매우 우수한 성능으로 내장된 대기열 및 게시/구독 기능을 제공하므로 비동기 작업을 처리할 때 매우 유용합니다. 웹 애플리케이션을 반응형으로 만들고 비동기 작업 처리를 구현하려는 경우 Redis가 좋은 선택입니다.

위 내용은 Redis의 비동기 작업 처리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.