이 기사는 Python 멀티스레딩 및 스레드 잠금에 대한 간단한 이해(코드)를 제공합니다. 필요한 친구가 참고할 수 있기를 바랍니다.
멀티스레딩 스레딩 모듈은 스레드 생성, 자체 스레드 클래스 생성, 스레드 통신, 스레드 동기화, 상호 배제 방식, 스레드 잠금@알아야 할 점! ! !
멀티스레딩
스레드란 무엇인가요?
스레드는 컴퓨터 멀티 코어 리소스를 사용하여 프로그램의 동시 실행을 완료할 수 있는 멀티 태스킹 프로그래밍 방법이기도 합니다.
스레드는 경량 프로세스라고도 합니다.
스레드의 특징
스레드는 컴퓨터 멀티 코어가 할당하는 가장 작은 단위입니다.
프로세스는 여러 스레드를 포함할 수 있습니다.
스레드는 실행 중인 프로세스이기도 하며 컴퓨터 리소스를 소비합니다. 프로세스의 리소스와 공간을 공유합니다
스레드 생성 및 삭제는 프로세스보다 훨씬 적은 리소스를 소비합니다
여러 스레드의 실행은 서로 간섭하지 않습니다
스레드에는 명령어 세트와 같은 고유한 속성도 있습니다. ID
threading 모듈 스레드 만들기
t=threading.Thread()
name: 스레드 이름, 비어 있는 경우 기본값, Tread-1, Tread-2, Tread-3
target: 스레드 함수
args: tuple, 위치에 따라 스레드 함수에 매개변수 전달
kwargs: 사전, 키 값에 따라 카운티 함수에 매개변수 전달
Function: 스레드 객체 생성
Parameters
t.start(): 스레드를 시작하고 자동으로 스레드 함수 실행
t.join([timeout]): 프로세스 재활용
t.is_alive(): 스레드 상태 보기
t.name(): 스레드 이름 보기
t.setName(): 스레드 이름 설정
t.daemon 속성: 기본값 메인 스레드 종료는 브랜치 스레드의 지속적인 실행에 영향을 미치지 않습니다. True로 설정하면 브랜치 스레드가 메인 스레드와 함께 종료됩니다.
t.daemon = True
t.setDaemon(Ture)
Set method
#!/usr/bin/env python3 from threading import Thread from time import sleep import os # 创建线程函数 def music(): sleep(2) print("分支线程") t = Thread(target = music) # t.start() # ****************************** print("主线程结束---------") '''没有设置的打印结果 主线程结束--------- 分支线程 ''' '''设置为True打印结果 主线程结束--------- '''
threading.currentThread: 현재 스레드 객체 가져오기
@여기 코드는 하위 스레드가 동일한 프로세스에서 변수를 공유함을 나타냅니다
from threading import Thread import time class MyThread(Thread): name1 = 'MyThread-1' def __init__(self,target,args=(), kwargs={}, name = 'MyThread-1'): super().__init__() self.name = name self.target = target self.args = args self.kwargs = kwargs def run(self): self.target(*self.args,**self.kwargs) def player(song,sec): for i in range(2): print("播放 %s:%s"%(song,time.ctime())) time.sleep(sec) t =MyThread(target = player, args = ('亮亮',2)) t.start() t.join()스레드 통신통신 방법: 여러 스레드가 프로세스의 메모리 공간을 공유하므로 전역 변수를 사용하여 스레드 간 통신을 완료할 수 있습니다.
스레드 동기화 상호 배제 방법
event
e = threading.Event(): 이벤트 객체 생성
e.wait([timeout]): If 상태를 설정합니다. 설정되면 이 기능은 차단되며 시간 초과는 시간 초과입니다.
e.set: e를 설정 상태로 변경
e.clear: 설정 상태 삭제
import threading from time import sleep def fun1(): print("bar拜山头") global s s = "天王盖地虎" def fun2(): sleep(4) global s print("我把限制解除了") e.set() # 解除限制,释放资源 def fun3(): e.wait() # 检测限制 print("说出口令") global s if s == "天王盖地虎": print("宝塔镇河妖,自己人") else: print("打死他") s = "哈哈哈哈哈哈" # 创建同步互斥对象 e = threading.Event() # 创建新线程 f1 = threading.Thread(target = fun1) f3 = threading.Thread(target = fun3) f2 = threading.Thread(target = fun2) # 开启线程 f1.start() f3.start() f2.start() #准备回收 f1.join() f3.join() f2.join()Thread locklock = threading.Lock(): 잠금 객체 생성
lock.release(): 잠금 해제
with를 사용하여 잠글 수도 있습니다
1 with lock: 2 ... 3 ...알아야 합니다! ! ! Python 스레드의 GIL 문제(전역 인터프리터):
결과:
통역사는 동시에 하나의 스레드만 해석하고 실행할 수 있습니다. 따라서 Python 스레드는 비효율적이지만 IO 차단이 발생하면 스레드가 인터프리터를 적극적으로 포기하므로 대기 시간이 긴 IO 프로그램 동시성에 Python 스레드가 더 적합합니다
Solution
프로세스를 사용하여 완료해 보세요. 동시성 (언급되지 않은 것과 동일)
C 인터프리터를 사용하는 것은 부적절합니다. (C#, JAVA 사용)
동시 작업을 위해 여러 솔루션을 조합하여 사용해보세요. 스레드는 대기 시간이 긴 IO로 사용됩니다
위 내용은 Python 멀티스레딩 및 스레드 잠금(코드)에 대한 간단한 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!