파이썬 ---- 스레드 1

이론적 지식 1. 스레드

  1. 스레드는 무엇인가

    스레드 파이프 라인이다.

    어떤 과정? 프로세스가 무엇을 경험하고 시작되었습니다입니까?

    열기 공정 : 메모리의 광장,로드 리소스와 데이터는이 공간의 자원을 사용할 수, CPU의 실행을 호출합니다.

    과정 : 주요 업무 : 오픈 스페이스는 데이터를로드합니다.

    스레드 : 파이프 라인, 코드를 실행.

1563953708745

과정 : 공간, 정적 하중 자원 부문.

스레드 : 코드 실행 기능, 동적.

추상적 인 개념.

열기 QQ는 : 프로세스를 열 : 메모리, 열린 공간에서, 데이터는 코드를 실행하는 스레드를 시작하는로드됩니다.

스레드는 프로세스가 여러 스레드를 포함 할 수 있지만이 있어야 메인 스레드. CPU 쓰레드가 실행의 가장 작은 단위이며, 과정에 따라 달라집니다.

  1. 프로세스 대 스레드 (이론)

    1. 열기 다중 프로세스 오버 헤드가 매우 크다. 10-100. 스레드를 켜고 오버 헤드가 매우 작습니다.

    2. 열기 멀티 프로세스가 느린, 빠른 개방 멀티 스레드.

    3. 큐가 공유 할 수있는 동일한 프로세스에서 스레드간에 데이터를 통해 공유 할 수 있습니다 사이에 프로세스 데이터를 직접 할 수 없습니다.

  2. 멀티 스레드 응용 프로그램 시나리오 소개

    동시성 : 앞뒤로 CPU 스위치 동시 멀티 프로세스, 멀티 스레드 동시성 (스레드간에 전환).

    더 복잡한 과정 : 오픈 여러 프로세스는 각 프로세스는 메인 스레드 내부 작업을 수행한다.

    멀티 스레딩 : 프로세스, 다중 스레드가 작업을 실행하는 과정을 엽니 다.

    다중 프로세스를 사용하는 경우, 경우 멀티 스레딩을 사용 하는가?

    프로그램 : 세 가지 작업.

    멀티 스레드 대부분 : 나중에 업무 경험 동시성하는 경우.

두 가지 방법 2. 스레드

# 第一种方式
from threading import Thread
def task(name):
     print(f'{name} is running')
if __name__ == '__main__':
    t = Thread(target=task,args=('mcsaoQ',))
    t.start()
    print('主线程')
#第二种方式
from threading import Thread
class MyThread(Thread):
    def run(self):
        print(f'{self.name} is running')
if __name__ == '__main__':
    t = MyThread()
    t.start()
    print('主线程')

3. 스레드와 프로세스의 대비

  1. 대비 속도

    from threading import Thread
    def task(name):
        print(f'{name} is running')
    if __name__ == '__main__':
        t = Thread(target=task,args=('mcsaoQ',))
        t.start()
        print('主线程')
    '''
    线程绝对要比进程要快:
        mcsaoQ is running
        主线程
    '''
  2. PID

    # pid 进程号
    from threading import Thread
    import os
    def task():
        print(f'子线程: {os.getpid()}')
    if __name__ == '__main__':
        t = Thread(target=task,)
        t.start()
        print(f'主线程: {os.getpid()}')
  3. 스레드간에 자원을 공유

    from threading import Thread
    import time
    x = 1000
    def task():
         time.sleep(3)
         print('子线程....')
    def main():
         print('111')
         print('222')
         print('333')
    if __name__ == '__main__':
         t = Thread(target=task)
         t.start()
         # t.join()
         main()

4. 기타 스레드

from threading import Thread
import threading
import time
def task(name):
     time.sleep(1)
     print(f'{name} is running')
     print(threading.current_thread().name)
if __name__ == '__main__':
     for i in range(5):
         t = Thread(target=task,args=('mcsaoQ',))
         t.start()
     # 线程对象的方法:
     # time.sleep(1)
     # print(t.is_alive())  # 判断子线程是否存活  ***
     # print(t.getName())  # 获取线程名
     # t.setName('线程111')
     # print(t.getName())  # 获取线程名
     # threading模块的方法:
     # print(threading.current_thread().name)  # MainThread
     # print(threading.enumerate())  # 返回一个列表 放置的是所有的线程对象
     print(threading.active_count())  # 获取活跃的线程的数量(包括主线程)
     print('主线程')

5. 데몬 스레드

보호자 :. 아동 보호자 주님, 한 주 끝으로, 하위 엔드 즉시
끝 상기 메인 스레드
다중 스레드가 같은 공간, 같은 프로세스 공간을 대신하는 과정은, 자원 정적 메인 쓰레드는 프로세스 공간 메모리에 살아있다. 필요한 조건.
메인 쓰레드는 :., 소멸의 과정을 모든 것을 당신이 완료 후 아이의 모든 스레드를 기다릴 필요가
메인 스레드는 메인 스레드가 끝나기 전에 끝날 때까지 데몬 스레드가 종료 모든 비 데몬 스레드 종료 때까지 기다려야합니다 기다려야합니다 .
데몬 스레드 : 모든 비 데몬 스레드의 끝과 메인 쓰레드가 종료 할 수 있도록 기다려야합니다.

from threading import Thread
import time
def foo():
    print(123)
    time.sleep(3)
    print("end123")
def bar():
    print(456)
    time.sleep(1)
    print("end456")
if __name__ == '__main__':
    t1=Thread(target=foo)
    t2=Thread(target=bar)
    t1.daemon = True
    t1.start()
    t2.start()
    print("main-------")

6. 뮤텍스 (잠금)

뮤텍스 잠금, 동기화 잠금 자물쇠입니다.

뮤텍스과 차이점에 가입?

뮤텍스 잠금. 임의 공정 잡아 질서, 불공정에 미리 가입하지만, 시리얼 있습니다합니다.

1563953747387

7. 교착 상태, 재귀 잠금

재귀 잠금 : 재귀 잠금 잠금하고, 잠금 레코드 취득 긴 1 카운트 잠긴 회 acquire2, 2 번, Release1 시간을 뺀 계산 잠겨만큼 로크 재귀 카운터가 0이 아닌 한, 다른 스레드는 잡을 수 없습니다.

from threading import Thread
from threading import Lock
from threading import RLock
import time
# lock_A = RLock()
# lock_B = RLock()
lock_A = lock_B = RLock()
class MyThread(Thread):
    def run(self):
        # lock_A.acquire()
        # lock_B.acquire()
        # print(111)
        # lock_A.release()
        # lock_B.release()
        self.f1()
        self.f2()
    def f1(self):
        lock_A.acquire()
        print(f'{self.name}拿到 A锁')
        lock_B.acquire()  # 第二个线程抢B锁
        print(f'{self.name}拿到 B锁')
        lock_B.release()
        lock_A.release()
    def f2(self):
        lock_B.acquire()
        print(f'{self.name}拿到 B锁')
        time.sleep(1)  # 第一个线程 睡1秒
        lock_A.acquire()  # 第一个线程抢A锁
        print(f'{self.name}拿到 A锁')
        lock_A.release()
        lock_B.release()
if __name__ == '__main__':
    # for i in range(3):
    #     t = MyThread()
    #     t.start()
    t1 = MyThread()
    t1.start()
    t2 = MyThread()
    t2.start()
    t3 = MyThread()
    t3.start()
    print('主线程')

8. 세마포어

잠금이 세마포어를 입력 할 하나 개의 스레드 또는 프로세스를 허용하기 전에 말하기 다중 스레드 또는 프로세스가 동시에 입력 할 수 있습니다

from threading import Thread
from threading import current_thread
from threading import Semaphore
import time
import random
sm = Semaphore(4)
# lock= Lock()
def go_public_wc():
    sm.acquire()
    print(f'{current_thread().name}正在厕所')
    time.sleep(random.randint(1, 3))
    sm.release()
if __name__ == '__main__':
    for i in range(20):
        t = Thread(target=go_public_wc)
        t.start()
    # print('主')

추천

출처www.cnblogs.com/hql1117/p/11239545.html