python 多线程

python 多线程

python 执行多任务的办法

进程

进程是操作系统调度资源的一个的基本单位

线程

线程是一个进程的实体 是cpu调度和分派的基本单位 他是比进程更小的能独立运行的基本单位 线程基本上不拥有系统资源 只拥有一点在运行中必不可少的资源

区别

  • 一个程序至少有一个进程 一个进程至少有一个线程
  • 线程的划分尺度小于进程(资源比进程少) 是的多线程程序的并发性高
  • 经常在执行过程中拥有独立的内存单元 而多个线程共享内存 从而极大的提高了程序的运行效率
  • 线程不能独立执行 必须存在进程中
  • 可以将进程理解为一条流水线 而其中的线程就是这个流水线上的工人
  1. 多线程 实现 多任务

同一类之间的线程 可以共享全局变量

使用 threading 模块生成线程

import threading,time
def dance():
    for i in range(50):
        time.sleep(0.1)
        print('dancee')

def sing():
    for i in range(50):
        time.sleep(0.1)
        print('sing')

# target 需要一个函数 不加()
t1 = threading.Thread(target=dance) # 开启一个线程
t2 = threading.Thread(target=sing) # 开启第二个线程

t1.start()
t2.start()# 启动线程
  1. 多进程 实现 多任务

不同的进程之间不可以共享全局变量

multiprocessing 使用 multiprocessing 模块生成进程

import multiprocessing
import time


def dance(m):
    for i in range(m):
        time.sleep(1)
        print('dance')

def sing(m):
    for i in range(m):
        time.sleep(1)
        print('sing')

if __name__ == '__main__': # 注意在window系统中 必须在运行这个py文件时才可以生成进程 不然报错
    p1 = multiprocessing.Process(target=dance,args=(20,))
    p2 = multiprocessing.Process(target=sing,args=(30,)) # 多线程 和 多进程 通过args传参 必须是元组
    p1.start()
    p2.start()

线程锁

lock = threading.Lock() 创建锁

lock.acquire() 开启锁

lock.release() 关闭锁

import threading
import time

n = 20
lock = threading.Lock() # 创建一把锁
def sell():
    global n
    while True:
        lock.acquire() # 加同步锁
        if n > 0:
            time.sleep(1)
            n -= 1
            lock.release() # 解锁
            print('{}卖出一张票 还剩{}'.format(threading.current_thread().name,n))
        else:
            lock.release()
            print('没票了')
            break

t1 = threading.Thread(target=sell,name='窗口1')
t2 = threading.Thread(target=sell,name='窗口2')
t1.start()
t2.start()

线程间通信

queue 结构 可以在不同线程间通信

生产者与消费者模式 (线程通信)

import queue
import threading

q = queue.Queue()
#生产者
def provider():
    for i in range(10):
        print('provider',i)
        q.put(i) # 放入队列 等待消费

# 消费者
def consumer():
    for i in range(10):
        print('consumer----',q.get()) # 从队列里获取信息消费 

t1 = threading.Thread(target=provider)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()

进程通信

注意 在进程中传递参数 使用的是 multiprocessing 类中 的 queue

import queue
import multiprocessing

q = multiprocessing.Queue()
#生产者
def provider(q):
    for i in range(10):
        print('provider',i)
        q.put(i) # 放入队列 等待消费

# 消费者
def consumer(q):
    for i in range(10):
        print('consumer----',q.get()) # 从队列里获取信息消费

if __name__ == '__main__':
    t1 = multiprocessing.Process(target=provider,args=(q,))
    t2 = multiprocessing.Process(target=consumer,args=(q,))

    t1.start()
    t2.start()

join方法

让主线程等待子线程执行完毕

posted @ 2021-08-20 14:47  zhiy  阅读(37)  评论(0)    收藏  举报