>  기사  >  백엔드 개발  >  Python 멀티스레딩 및 스레드 잠금(코드)에 대한 간단한 이해

Python 멀티스레딩 및 스레드 잠금(코드)에 대한 간단한 이해

不言
不言원래의
2018-09-14 17:16:261918검색

이 기사는 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: 현재 스레드 객체 가져오기

@여기 코드는 하위 스레드가 동일한 프로세스에서 변수를 공유함을 나타냅니다

#!/usr/bin/ env python3
from threading import Thread
from time import sleep
import os

#스레드 함수 생성
def music():
        global a
                                         ~             def music():
t = Thread(대상 = 음악)
t.start( )
t.join()
print("메인 스레드의 a =",a) 자신만의 스레드 클래스 만들기

검사 포인트: 클래스 사용, 상위 클래스 호출 __init__ 메소드, 함수 *매개변수 전달 및 ** 매개변수 전달



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 lock

lock = threading.Lock(): 잠금 객체 생성


lock.acquire(): 잠금

lock.release(): 잠금 해제

with를 사용하여 잠글 수도 있습니다

1 with lock:
2     ...
3     ...

알아야 합니다! ! !

Python 스레드의 GIL 문제(전역 인터프리터):


python---> 멀티 스레딩 지원---> 동기화 상호 배제 문제---> Super 잠금(통역사 잠금)---->통역사는 동시에 하나의 스레드만 해석할 수 있습니다--->효율성이 낮습니다

결과:

통역사는 동시에 하나의 스레드만 해석하고 실행할 수 있습니다. 따라서 Python 스레드는 비효율적이지만 IO 차단이 발생하면 스레드가 인터프리터를 적극적으로 포기하므로 ​​대기 시간이 긴 IO 프로그램 동시성에 Python 스레드가 더 적합합니다

Solution

프로세스를 사용하여 완료해 보세요. 동시성 (언급되지 않은 것과 동일)

C 인터프리터를 사용하는 것은 부적절합니다. (C#, JAVA 사용)

동시 작업을 위해 여러 솔루션을 조합하여 사용해보세요. 스레드는 대기 시간이 긴 IO로 사용됩니다

위 내용은 Python 멀티스레딩 및 스레드 잠금(코드)에 대한 간단한 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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