>  기사  >  백엔드 개발  >  Python 다중 스레드 동기화란 무엇입니까? 스레드 잠금이란 무엇입니까?

Python 다중 스레드 동기화란 무엇입니까? 스레드 잠금이란 무엇입니까?

乌拉乌拉~
乌拉乌拉~원래의
2018-08-21 19:44:371931검색

Python 프로그래밍 언어를 처음 접하는 사람들은 Python 프로그래밍을 처음 배우기 시작할 때 Python 스레드 동기화에 대해 거의 알지 못합니다. python more 스레드에 대한 지식 동기화 및 파이썬 다중 스레드 잠금.

스레드 동기화

여러 스레드가 공동으로 특정 데이터를 수정하는 경우 예측할 수 없는 결과가 발생할 수 있습니다. 데이터의 정확성을 보장하려면 여러 스레드를 동기화해야 합니다.

Thread 객체의 Lock 및 Rlock을 사용하여 간단한 스레드 동기화를 구현할 수 있습니다. 두 객체 모두 한 번에 하나의 스레드에서만 작업해야 하는 데이터의 경우 획득 및 해제 방법을 사용할 수 있습니다. 방법 사이. 다음과 같습니다:

멀티스레딩의 장점은 동시에 여러 작업을 실행할 수 있다는 것입니다(적어도 그렇게 느껴집니다). 그러나 스레드가 데이터를 공유해야 하는 경우 데이터가 동기화되지 않는 문제가 발생할 수 있습니다.

이 상황을 생각해 보세요. 목록의 모든 요소가 0이고, "set" 스레드는 모든 요소를 ​​뒤에서 앞으로 1로 변경하며, "print" 스레드는 목록을 앞에서 뒤로 읽고 인쇄하는 일을 담당합니다.

그런 다음 "set" 스레드가 변경되기 시작하면 "print" 스레드가 목록을 인쇄하고 출력은 0과 1의 절반이 될 것입니다. 이것이 데이터의 비동기화입니다. 이러한 상황을 방지하기 위해 잠금 개념이 도입되었습니다.

멀티 스레드 잠금

잠금에는 잠김과 잠금 해제의 두 가지 상태가 있습니다. "set"과 같은 스레드가 공유 데이터에 액세스하려고 할 때마다 먼저 잠금을 획득해야 합니다. "print"와 같은 다른 스레드가 이미 잠금을 획득한 경우 "set" 스레드가 일시 중지되도록 해야 합니다. 이는 동기식 차단입니다. 스레드 " Print "가 액세스가 완료되고 잠금이 해제된 후 스레드 "설정"이 계속되도록 합니다.

이 처리 후 목록을 인쇄할 때 모두 0 또는 모두 1이 출력되므로 더 이상 반은 0이고 반은 1인 민망한 장면이 발생하지 않습니다.

예제

예제는 다음과 같습니다.

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import threading
import time
 
class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
       # 获得锁,成功获得锁定后返回True
       # 可选的timeout参数不填时将一直阻塞直到获得锁定
       # 否则超时后将返回False
        threadLock.acquire()
        print_time(self.name, self.counter, 3)
        # 释放锁
        threadLock.release()
 
def print_time(threadName, delay, counter):
    while counter:
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1
 
threadLock = threading.Lock()
threads = []
 
# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
 
# 开启新线程
thread1.start()
thread2.start()
 
# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)
 
# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"

위 내용은 이 글의 전부입니다. 이 글은 주로 python 멀티 스레드 동기화 관련 지식을 소개하는 내용입니다. 위에서 말한 내용을 이해하십시오. 이 글에서 제가 설명한 내용이 여러분에게 도움이 되고 파이썬을 더 쉽게 배울 수 있기를 바랍니다.

더 많은 관련 지식을 알고 싶으시면 PHP 중국어 홈페이지의 Python tutorial 칼럼을 방문해 주세요.

위 내용은 Python 다중 스레드 동기화란 무엇입니까? 스레드 잠금이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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