-
开启进程的另一种方式
-
面向对象
from multiprocessing import Process
class MyProcess(Process):
def __init__(self,参数):
self.属性 = 参数
super().__init__()
def run(self):
print('子进程代码')
if __name__ == '__main__':
p = MyProcess(参数)
p.start()
-
-
守护进程:会等待主进程代码结束后,立即结束
-
p.daemon =True
-
一般情况下,多个进程的执行顺序可能是
-
主进程代码结束——》守护进程代码结束——》子进程代码结束——》主进程代码结束
-
-
锁
-
保证数据的安全
-
会降低效率
-
互斥锁
-
列子:抢票、购买车票
lock = lock()
lock.acquire()
......
lock.release()
或者
with lock:
.................
import json
from multiprocessing import Process,Lock
def search(i):
with open('buy_ticket.txt',encoding='utf-8',mode='r') as f:
dic = json.load(f)
print(f'{i}剩余票数为:{dic["count"]}')
return dic
def buy_ticket(dic,i):
if dic['count'] > 0:
with open('buy_ticket.txt',encoding='utf-8',mode='w') as f:
dic['count'] -= 1
json.dump(dic,f)
print(f'{i} 购票成功')
def get_ticket(i,lock):
dic = search(i)
with lock:
buy_ticket(dic,i)
if __name__ == '__main__':
lock = Lock()
p_l = []
for i in range(10):
p = Process(target=get_ticket,args=(i,lock))
# p1 = Process(target=buy_ticket, args=(i,))
p.start()
p_l.append(p)
# p1.start()
# for p in p_l:
# p.join()
-
-
锁
-
队列 IPC 进程之间的通信 ——数据安全
-
基于socket实现的,也是基于picke,还是基于lock实现的
-
PIpe 管道,基于socket实现的,也是基于picke,——数据不安全
-
-
生产者消费者模型
-
把原本获取数据处理数据的完整过程进行了解耦
-
把生产数据和消费数据分开,根据生产和消费的效率不同,来让程序的执行效率达到平衡
-
-
同步阻塞
-
调用一个函数必须等待结果,cpu不工作,input sleep recv recvfrom accept get
-
-
同步非阻塞
-
调用一个函数必须等待结果,cpu工作——》调用一个高计算的函数 strip eval('1+2-3+4')
-
-
异步阻塞
-
调用函数不需要立即获取结果,而是继续做其他的事情,再获取结果的时候不知道先获取谁的结果,但是总是需要等待结果,
-
-
异步非阻塞
-
调用函数不需要立即获取结果,也不需要等 start terminate(结束)
-
二、今日内容
1、进程内容
-
进程之间数据隔离,资源分配的最小单位,可以利用多核,操作系统调度
-
multiprocessing如何开启进程 start join
-
进程也有数据不安全问题 lock可以解决
-
进程之间可以通信IPC
-
队列 安全
-
管道 不安全
-
第三方工具
-
kafka
-
redis
-
-
-
进程之间可以通过Manage类实现数据共享
-
生产者消费者模型
-
2、生产者消费者模型
3、线程的概念
-
能被操作系统调度给cpu执行的最小单位
-
可以利用多核的
-
线程之间的数据共享,也是操作系统调用的
-
数据不安全
-
全局解释器锁 GIL
-
导致了,同一个进程中多个线程只能有一个线程被CPU执行
-
节省的是IO操作的时间,而不是cpu计算的时间
-
-
线程没有terminate方法,不能关闭,只能等待他执行完成
-
数据共享的
4、threading模块开启线程
-
开启线程
from threading import Thread,current_thread,enumerate,active_count
import os
import time
def func(i):
print(f'start{i}')
print(current_thread().ident) #获取线程ID
time.sleep(1)
print(f'end{i}')
t_lst = []
for i in range(10):
t = Thread(target=func,args=(i,))
t.start()
t_lst.append(t)
print(t.ident,os.getpid())
print('111')
print('线程的对象列表:%s'%enumerate())
print('线程的对象列表数量:%s'%active_count())
for t in t_lst:
t.join() #所有线程执行完后,才执行下面的代码
print('开启了')
-
面向对象开启线程
from threading import Thread
class MyThread(Thread):
def __init__(self,a,b):
self.a = a
self.b = b
super().__init__()
def run(self):
print(self.ident)
t = MyThread(1,2)
t.start()