이 기사에서는 멀티스레딩에 대한 관련 내용을 주로 소개하는 Python에 대한 관련 지식을 제공합니다. 여러 스레드가 동일한 프로그램에서 실행될 수 있으며 각 스레드는 서로 다른 작업을 완료합니다. 모든 사람.
【관련 추천: Python3 동영상 튜토리얼】
쓰레드는 CPU가 자원을 할당하는 기본 단위입니다. 프로그램이 실행되기 시작하면 프로그램은 프로세스가 되며 프로세스는 하나 이상의 스레드와 동일합니다. 다중 스레드 프로그래밍이 없는 경우 프로세스는 기본 스레드와 동일합니다. 다중 스레드 프로그래밍이 있는 경우 프로세스에는 여러 스레드(기본 스레드 포함)가 포함됩니다. 스레드를 사용하면 대규모 프로그램 개발이 가능합니다.
여러 스레드가 동일한 프로그램에서 실행될 수 있으며 각 스레드는 서로 다른 작업을 완료합니다.
멀티 스레드 백그라운드 서비스 프로그램은 차단 없이 동시에 여러 작업을 처리할 수 있습니다.
멀티 스레드 프로그래밍의 특징은 프로그램 실행 효율성과 처리 속도를 향상시킬 수 있다는 것입니다. Python 프로그램은 상대적으로 독립적인 여러 스레드를 동시에 병렬로 실행할 수 있습니다.
Python은 멀티 스레드를 생성하는 두 가지 방법을 지원합니다:
~threading.Thread()를 통해 생성됩니다.
~threading.Thread 클래스를 상속하여.
생성 문법 형식:
thread.Thread(group=Nore,targt=None,args=(),kwargs={},*,daemon=None)
매개 변수 설명:
~group: None이어야 하며 ThreadGroup 클래스와 관련되어 일반적으로 사용되지 않습니다.
~target: 스레드가 호출하는 개체가 대상 함수입니다.
~name: 스레드에 이 이름을 지정합니다. 기본값은 Tread-x이고, x는 1부터 시작하는 일련번호이며, 생성된 첫 번째 스레드의 이름은 Tread-1입니다.
~args: 키워드 인수, 대상 함수에 대한 사전을 전달합니다.
~daemon: 메인 스레드 종료 시 스레드 종료 여부를 설정하는 데 사용됩니다.
예:
import threading def test (x,y): for i in range(x,y): print(i) thread1 = threading.Thread(name='t1',target= test,args=(1,10)) thread2 = threading.Thread(name='t2',target= test,args=(11,20)) thread1.start() #启动线程1 thread2.start() #启动线程2
출력:
1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19
설명: 두 프로그램은 동시에 실행되므로 결과가 매번 1~10으로 순차적일 필요는 없습니다. 이는 CPU가 두 스레드에 할당한 시간 세그먼트를 기반으로 합니다. 결정하다. 매번 결과가 다른 것을 볼 수 있습니다.
threading.Thread는 클래스이며 상속될 수 있습니다.
예:
import threading class mythread(threading.Thread): def run(self): for i in range(1,10): print(i) thread1 = mythread(); thread2 = mythread(); thread1.start() thread2.start()
출력:
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
설명: threading.Thread를 상속하도록 클래스를 사용자 정의한 다음 상위 클래스의 run 메서드를 재정의합니다. 이 메서드는 스레드가 시작될 때 자동으로 실행됩니다(start() 실행). .
파이썬에서 메인 스레드는 가장 먼저 시작되는 스레드입니다.
~상위 스레드: 스레드 B가 시작 스레드 A에서 시작되면 A는 B의 상위 스레드입니다.
~하위 스레드: B는 A의 하위 스레드입니다.
스레드를 생성할 때 damon 속성이 있는데, 이를 사용하여 메인 스레드를 결정합니다. 데몬이 False로 설정되면 메인 스레드가 종료될 때 스레드가 종료되지 않고 메인 스레드는 하위 스레드가 실행을 마칠 때까지 기다립니다. 데몬이 True로 설정되면 메인 스레드가 종료될 때 스레드도 종료되고, 메인 스레드가 종료될 때 다른 하위 스레드도 강제로 종료됩니다.
데몬 사용 시 참고 사항:
~데몬 속성은 start() 전에 설정해야 합니다. 그렇지 않으면 RuntimeError 예외가 발생합니다.
~각 스레드에는 데몬 속성이 있으며, 설정하지 않을 경우 설정할 수 있습니다. 기본값은 None입니다.
~자식 스레드가 데몬 속성을 설정하지 않은 경우 현재 스레드의 데몬을 가져와서 설정합니다. 하위 스레드는 하위 스레드의 데몬 값을 상속하며 이는 None을 설정하는 것과 동일한 효과를 갖습니다.
~메인 스레드에서 생성된 모든 스레드에 대해 daemon 속성이 설정되지 않은 경우 기본값은 daemon=False입니다.
예:
import time import threading def test(): time.sleep(10) for i in range(10): print(i) thread1 = threading.Thread(target=test,daemon=False) thread1.start() print('主线程完成了')
출력:
主线程完成了 0 1 2 3 4 5 6 7 8 9
설명: 메인 스레드가 실행을 마치고 출력되면 잠시 기다렸다가 0~9를 출력합니다. daemon=False가 daemon=True로 변경되면 for i in range(10) 문이 실행되지 않습니다.
스레드가 다른 스레드의 조인 메서드를 호출하면 호출 스레드가 종료될 때까지 호출자가 차단됩니다.
문법 형식:
join(timeout-=None)
timeout 매개변수는 호출자가 기다리는 시간을 지정합니다. 설정되지 않은 경우 호출된 스레드가 종료되고 호출된 스레드가 끝날 때까지 기다립니다. 그 중 하나의 스레드는 조인을 통해 여러 번 호출될 수 있습니다.
예:
import time import threading def test(): time.sleep(5) for i in range(10): print(i) thread1=threading.Thread(target=test) thread1.start() thread1.join() print('主线程完成了')
출력:
0 1 2 3 4 5 6 7 8 9 主线程完成了
설명: 조인 메서드를 추가하려면 thread1.start() 뒤에 thread1.join()을 추가하세요. 출력할 때 메인 스레드는 실행하기 전에 0~9가 출력될 때까지 기다립니다. 자체 인쇄 출력.
~run(): 스레드 활동을 나타내는 데 사용되는 메서드
~start(): 스레드 시작
~join(): 스레드가 종료될 때까지 대기
~isAlive( ): 스레드 활성 여부 반환
~getName(): 스레드 이름 반환
~setName(): 스레드 이름 설정
예:
from threading import Thread, Event import time def countdown(n, started_evt): print('正在运行') started_evt.set() while n > 0: print('时间', n) n -= 1 time.sleep(2) started_evt = Event() print('开始倒计时') t = Thread(target=countdown, args=(10, started_evt)) t.start() started_evt.wait() print('倒计时运行')
출력:
开始倒计时 正在运行 时间 10 倒计时运行 时间 9 时间 8 时间 7 时间 6 时间 5 时间 4 时间 3 时间 2 时间 1
Alive,顾名思义,它表示线程当前是否为可用状态,如果线程已经启动,并且当前没有任何异常的话,则返回true,否则为false
Thread.isAlive() :顾名思义,是表示当前线程时候为可用状态,即是否已经在启动,并且在运行的状态;
异步模式的情况下,同时有一个线程在修改共享数据,另一个线程在读取共享数据,当修改的共享数据的线程没有处理完毕,读取数据的线程肯定会得到错误的结果。如果采用多线程的同步控制机制,当处理共享数据的线程完成处理数据之后,读取线程就读取数据。
python的锁就解决这一问题,锁住线程,只允许一个线程操作,其他线程排队等待,待当前线程操作完毕后,再按顺序一个一个来运行。
python的threading模块提供了RLock锁解决方法。在某一时间只能让一个线程操作的语句放到RLock的acquire方法和release方法之间,即acquire相当于给RLack上锁,而release相当于解锁。
示例:
import threading class mythread(threading.Thread): def run(self): global x #声明一个全局变量 lock.acquire() #上锁 x +=10 print('%s:%d'%(self.name,x)) lock.release() #解锁 x = 0 #设置全局变量初始值 lock = threading.RLock() #创建可重入锁 list1 = [] for i in range(5): list1.append(mythread()) #创建五个线程,放到同一列表中 for i in list1: i.start() #开启列表线程
输出:
Thread-1:10 Thread-2:20 Thread-3:30 Thread-4:40 Thread-5:50
解释:
条件锁常用的方法:
~acquire([timeout]):调用关联锁的方法
~release():解锁
~wait():使线程进入 Condition 的等待池等待通知并释放解锁。使用前线程必须已获得锁定,否则将抛出异常。
~notify():从等待池挑选一个线程并通知,收到通知的线程将自动调用 acquire() 尝试获得,其他线程仍然在等待池中等待通知,直到该线程收到通知 调用该方法,否则将会抛出异常。
~notify ALL():跟notify() 一样,但这个方法对应的是所有的线程。
示例:
题目:有几个生产车间生产,几个消费者购买,当生产达到一定数量时,停止生产。
import threading import time condtion = threading.Condition() sheep = ['1件产品','1件产品','1件产品','1件产品','1件产品'] class Producer(threading.Thread): def __init__(self, name): super().__init__(name=name) pass def run(self): global condtion, sheep while True: time.sleep(0.1) condtion.acquire() if len(sheep) < 10: print(self.name + "生产了1件产品") sheep.append('1件产品') condtion.notifyAll() pass else: print("仓库满了,停止生产!") condtion.wait() pass condtion.release() pass pass class Customer(threading.Thread): def __init__(self, name): super().__init__(name=name) pass def run(self): global condtion, sheep while True: time.sleep(0.1) condtion.acquire() if len(sheep) > 0: meat = sheep.pop() print(self.name + "购买了" + meat + "还剩多少" + str(len(sheep)) + "件") condtion.notifyAll() pass else: print("买光了,等待") condtion.wait() pass condtion.release() pass pass if __name__ == "__main__": p1 = Producer("1号生产车间") p2 = Producer("2号生产车间") p3 = Producer("3号生产车间") p4 = Producer("4号生产车间") p5 = Producer("5号生产车间") p6 = Producer("6号生产车间") p1.start() p2.start() p4.start() p5.start() p6.start() c1 = Customer('小王') c2 = Customer('小李') c3 = Customer('小贾') c4 = Customer('小沈') c5 = Customer('小刘') c1.start() c2.start() c3.start() c4.start() c5.start()
【相关推荐:Python3视频教程 】
위 내용은 Python의 멀티스레딩(요약)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!