python的多线程threading

多线程threading

1.Thread创建线程:

上代码:

#!/usr/bin/env python3

import threading 
import time

def A():
    t_name = threading.current_thread().name #获取线程名称
    for i in range(5):
        print(i)
        time.sleep(1)
    print(t_name)


t1 = threading.Thread(target = A) #创建线程对象
t1.start() #启动线程
print(threading.current_thread().name)

输出结果:

0
MainThread
1
2
3
4
Thread-1

  • 一个进程最少且必须有一个线程,是主线程:MainThread,创建出来的是子线程,用Thread-1,Thread-2···命名
  • 主线程会等待子线程执行完毕之后才会结束

2.互斥锁(线程锁、全局变量锁):

  • 当多个线程同时对一个全局变量进行修改时会出现争抢,导致可能抢到的值是相同的,造成一些线程做了无用功。

上代码:

#!/usr/bin/env python3

import threading 
import time

num = 0

def A():
    global num
    for i in range(1000000):
        num += 1

def B():
    global num
    for i in range(1000000):
        num += 1


t1 = threading.Thread(target = A)
t1.start()
t2 = threading.Thread(target = B)
t2.start()

t1.join()  #等待线程执行完成后在往下执行
t2.join()
print(num)

执行结果:

1924932

  • 按理说结果应该是2000000才对,可是由于线程之间的对全局变量的争抢,导致了值得不稳定。所以要对全局变量每次操作时进行加锁,避免其混乱。

改进版:

#!/usr/bin/env python3

import threading 
import time

num = 0

def A():
    global num
    for i in range(1000000):
        lock.acquire() #加锁
        num += 1
        lock.release() #解锁

def B():
    global num
    for i in range(1000000):
        lock.acquire() #加锁
        num += 1
        lock.release() #解锁

lock = threading.Lock()  #创建锁
t1 = threading.Thread(target = A)
t1.start()
t2 = threading.Thread(target = B)
t2.start()

t1.join()  #等待线程执行完成后在往下执行
t2.join()
print(num)

执行结果:

2000000

3.进程与线程的区别

  • 每个程序都有至少一个进程,每个进程都有至少一个线程。
  • 线程依附于进程,不能独立存在
  • 进程与进程直接的内存资源不能共享,只能通过特殊渠道才能通信,如Queue。但是同一进程内的所有线程是可以资源共享的。
  • 进程消耗的资源多,线程消耗资源少。
原文地址:https://www.cnblogs.com/PrettyTom/p/6592164.html