python 多线程
python 多线程
python 执行多任务的办法
进程
进程是操作系统调度资源的一个的基本单位
线程
线程是一个进程的实体 是cpu调度和分派的基本单位 他是比进程更小的能独立运行的基本单位 线程基本上不拥有系统资源 只拥有一点在运行中必不可少的资源
区别
- 一个程序至少有一个进程 一个进程至少有一个线程
- 线程的划分尺度小于进程(资源比进程少) 是的多线程程序的并发性高
- 经常在执行过程中拥有独立的内存单元 而多个线程共享内存 从而极大的提高了程序的运行效率
- 线程不能独立执行 必须存在进程中
- 可以将进程理解为一条流水线 而其中的线程就是这个流水线上的工人
- 多线程 实现 多任务
同一类之间的线程 可以共享全局变量
使用 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()# 启动线程
- 多进程 实现 多任务
不同的进程之间不可以共享全局变量
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方法
让主线程等待子线程执行完毕

浙公网安备 33010602011771号