并发编程
Posted xinjie123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程相关的知识,希望对你有一定的参考价值。
计算机基础
io操作:
i input 输入 相对内存 进入内存 # read # recv # input # load o output 输出 相对内存 从内存出去 # write # send # dump
多道操作系统:
- 提高了cpu的利用率
- 第一次出现了一个概念:任务状态的保存
- 数据的隔离的概念(由于同时在执行的多个程序之间的数据不能混为一谈)
单处理机系统中的多道程序运行是的特点:
- 多道:计算机内存中同时存放几道相互独立的程序
- 宏观上并行:同时进入系统的几道相互独立的程序
- 微观上串行:实际上,各道程序轮流的用cpu,并交替运行
进程:
- 是计算机中资源分配的最小单位
- 并且进程与进程之间的数据是隔离的
同步和异步:
- 同步:有几件事情,先做一件,做完一件在做一件
- 异步:有几件事情,同时完成
- 阻塞:程序由于不符合某个条件或者要等待某个条件满足在一个某一个地方进入等待状态
- 非阻塞:所有不阻塞的程序
- 如果想让阻塞的程序不阻塞,就调用setblocking()
同步阻塞非阻塞和异步阻塞非阻塞:
# 同步阻塞 # 一件事儿一件事儿的做 # 中间还要被阻塞 # 同步非阻塞 : 费力不讨好 # 一件事儿一件事儿的做 # 但是不阻塞 # 异步阻塞 # 同时进行的 # 每一件事儿都会遇到阻塞事件 # 异步非阻塞 # 几个事情同时进行 # 每一件事都不阻塞
进程模块
进程id:
- os.getpid() ---->获取当前进程号
- os.getppid() ----->获取当期父进程号
在python代码中开启子进程:
import os from multiprocessing import Process def son_process(): 代码快 print("执行我了") if __name__ == ‘__main__‘: p = Process(targe = son_process) p.start()
进程中的一些操作:
- 子进程对于主进程中的全局变量的修改是不生效的
- join的功能就是阻塞 只有一个条件是能够让我继续执行 这个条件就是子进程结束
join操作的扩展:
- join(timeout = 时间) 如果没有写这个参数 join会一直阻塞到子进程结束 如果设置的超市时间,那么意味着如果不足时间(你自己写的)子进程结束了,程序结束阻塞,如果超过时间还没有结束,那么也结束阻塞
- terminate() 也可以强制结束一个子进程
守护进程:
- 设置子进程为守护进程,守护进程会随着主进程的代码结束而结束
- 由于主进程要负责给所有的子进程收尸,所以主进程必须是最后结束,守护进程只能在主进程的代码结束之后就认为主进程结束了
- 守护进程在主进程的代码结束之后就结束了,不会等待其他子进程结束
- 守护进程会等待主进程的代码结束而结束,不会等待其他子进程的结束
- 要想守护进程等待其他子进程,只需要在主进程中加上join
操作多个子进程的结束和join阻塞:
# lst = [] # for i in range(n): # p = Process() # lst.append(p) # p.start() # for p in lst: # p.join() # p.terminate()
开启子进程的另一种方式:
import os from multiprocessing import Process class Myprocess(Process): def __init__(self,参数): super().__init__() self.一个属性 = 参数 def run(self): print(子进程中要执行的代码) if __name__ == ‘__main__‘: conn = "一个链接" mp = Myprocess(conn) mp.start()
锁的概念:
import json import time from multiprocessing import Process,Lock def search(name): ‘‘‘查询余票的功能‘‘‘ with open(‘ticket‘) as f: dic = json.load(f) print(name , dic[‘count‘]) def buy(name): with open(‘ticket‘) as f: dic = json.load(f) time.sleep(0.1) if dic[‘count‘] > 0: print(name,‘买到票了‘) dic[‘count‘] -=1 time.sleep(0.1) with open(‘ticket‘,‘w‘) as f: json.dump(dic,f) def get_ticket(name,lock): search(name) lock.acquire() # 只有第一个到达的进程才能获取锁,剩下的其他人都需要在这里阻塞 buy(name) lock.release() # 有一个人还锁,会有一个人再结束阻塞拿到钥匙 if __name__ == ‘__main__‘: lock = Lock() for i in range(10): p = Process(target=get_ticket,args=(‘name%s‘%i,lock)) p.start()
以上是关于并发编程的主要内容,如果未能解决你的问题,请参考以下文章