并发编程 之进程相关

# 1.守护进程  1个进程b 他的守护进程a 在被守护进程b死亡的时候a已死亡# 应用场景 在运行的qq过程中,开启了一个进程 用于下载文件 然而文件还没有下完qq就退出了 下载任务也应该跟随qq的退出而结束# import time# from multiprocessing import Process,Lock#### def task():#     print(‘妃子的一生‘)#     time.sleep(5)#     print(‘妃子凉凉了‘)### if __name__ == ‘__main__‘:#     fz = Process(target=task)#     fz.daemon = True#     fz.start()#     print(‘皇帝登基了‘)#     time.sleep(2)#     print(‘当了10年皇帝‘)#     print(‘皇帝驾崩了‘)

# 2.互斥锁# 当多个进程共享数据时候时,可能会造成数据错乱# 1.使用join ,来让这些进程串行 但是这将造成无法并发,进程执行任务的顺序就固定了.# 2.使用同一把锁 将需要共享的数据加锁 其他进程在访问数据的时候 那就必须等待当前进程使用完毕# 锁的本质 就是一个bool类型的数据,在执行代码前会先判断这个值#必须保证锁是同一把#锁的实现原理伪代码:## l=False## def task4(lock):#     global  l#     if l == False:#         l=True#         print(‘my name is 2‘)#         time.sleep(random.randint(1,2))#         print(‘my  age is 19‘)#         l=False######### import random# import time### def task1(lock):#     lock.acquire()  # 是一个阻塞函数 会等到别的进程释放锁时才能继续执行#     print(‘my name is 1‘)#     time.sleep(random.randint(1,2))#     print(‘my  age is 18‘)#     lock.release()## def task2(lock):#     lock.acquire()#     print(‘my name is 2‘)#     time.sleep(random.randint(1,2))#     print(‘my  age is 19‘)#     lock.release()## def task3(lock):#     lock.acquire()#     print(‘my name is 3‘)#     time.sleep(random.randint(1,2))#     print(‘my  age is 20‘)#     lock.release()## if __name__ == ‘__main__‘:#     lock=Lock()#     p1 = Process(target=task1,args=(lock,))#     p1.start()#     p2 = Process(target=task2,args=(lock,))#     p2.start()#     p3 = Process(target=task3,args=(lock,))#     p3.start()#多个任务在共享一个数据 串行效率低 但是不会出现问题 并发效率高但是数据可能错乱

#模拟抢票# import json,time,random# from multiprocessing import Process,Lock# def check_ticket(usr):#     with open("ticket.json",‘r‘,encoding=‘utf-8‘) as f:#         dic =json.load(f)#         print(‘%s查看剩余票数%s‘%(usr,dic[‘count‘]))## def buy_ticket(usr):#     with open("ticket.json",‘r‘,encoding=‘utf-8‘) as f:#         dic =json.load(f)#         if dic[‘count‘] > 0:#             time.sleep(random.randint(1,2))#             dic[‘count‘]-=1#             with open(‘ticket.json‘,‘w‘,encoding=‘utf-8‘)as f2:#                 json.dump(dic,f2)#                 print(‘%s购买成功!‘%usr)### def task(usr,lock):#     check_ticket(usr)#     lock.acquire()#     buy_ticket(usr)#     lock.release()# if __name__ == ‘__main__‘:#     lock = Lock()###     for i in range(5):#         p=Process(target=task,args=(‘用户%s‘%i,lock))#         p.start()  #首先全部并发查看票,然后买票的时候串行

#join 和锁的区别# 1.join中的顺序是固定的 不公平# 2.join是完全串行 而锁可以让部门代码串行,其他代码并发

# #Lock 和 Rlock的区别# from multiprocessing import RLock# # 1.在lock下 如果在执行代码前添加了2次lock.acquire() ,代码将无法执行# lock = Lock()# lock.acquire()# lock.acquire()# print(‘哈哈‘)# lock.release()# # 2.在Rlock模式下 如果在执行代码前添加无数次lock.acquire(),代码都可以运行. 表示重入锁 可以多次执行acquire## lock = RLock()# lock.acquire()# lock.acquire()# print(‘哈哈‘)# lock.release()###### import time## def task5(i):#     lock.acquire()#     lock.acquire()#     print(i)#     time.sleep(3)#     lock.release()## if __name__ == ‘__main__‘:#     lock = RLock#     p1 = Process(target=task5,args=(1,lock))#     p1.start()#     p2 = Process(target=task5,args=(2,lock))#     p2.start()

# 当RLock存在2个进程进行竞争的时候 :# 当只有一次acquire的时候也可以起到锁的作用;在代码中即为先打印了1之后过3秒再打印2# 如果增加了一次acquire的执行次数而不添加release的次数,将会阻塞在第二个acquire, 即只打印出1,2不打印

# ipc进程间的通讯# 三种方式:# 1. 使用共享文件,过个进程同时读写一个文件#     i/o速度慢,传输大小不受限制# 2.管道 是基于内存的速度快 但是是单向的 用起来麻烦# 3.申请共享内存空间,多个进程可以共享这个内存区域,速度快 但是数据量不能太大

from multiprocessing import Manager,Process

def work(d):    d[‘count‘]-=1

if __name__ == ‘__main__‘:    # 开启了一个Manager共享内存    with Manager() as m:        dic = m.dict({‘count‘:2}) #在这个空间中存储了一个字典        p_l = []        for i in range(2):            p=Process(target=work,args=(dic,))            p_l.append(p)            p.start() #就绪状态        for p in p_l:            p.join()        print(dic)        #相当于给子进程进行了串行

#队列: 不止用于进程之间的通讯 先进先出

from multiprocessing import Queueq = Queue(1) #创建1个队列 最多可以存一个数据q.put(‘a‘) #将a装入到队列中q.put(‘b‘,False)  #程序阻塞  put默认阻塞 当容器里面装满继续装就会阻塞住# 2.put中如果第二个参数设置为False 表示不会阻塞无论容器是否塞满,都会强行塞,如果满了就抛异常

print(q.get()) #取出一个数据aprint(q.get()) #没有添加数据第二次取无数据就阻塞 默认阻塞# 如果get中参数设为False 也是非阻塞,当取完了还要去取就报错# 其中还有个参数timeout=  设置为3的时候表示 当阻塞状态下3秒还没有拿到数据会报错

原文地址:https://www.cnblogs.com/fanbiyong/p/10197551.html

时间: 2024-10-09 06:07:49

并发编程 之进程相关的相关文章

Java并发编程:进程和线程

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

并发编程之进程与线程

并发编程之进程与线程 2.1 线程与进程 2.1.1 进程 2.1.2 线程 2.1.3 二者对比 2.2 并行与并发 2.3 应用 2.1 线程与进程 2.1.1 进程 程序指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存.在指令运行过程中还需要用到磁盘.网络等设备.进程就是用来加载指令.管理内存.管理IO的. 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程. 进程就可以视为程序的一个实例.大部分程序可以同时运行多个实例进程(例如记

Python并发编程之进程2

引言 本篇介绍Python并发编程下的进程,先介绍进程的相关知识,然后对python中multiprocessing模块进行介绍(Process.Pipe.Queue以及 Lock). 进程(process) 在面向线程设计的系统(如当代多数操作系统.Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器. 进程拥有自己独立的内存空间,所属线程可以访问进程的空间. 程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 例如,我们在PyCharm开发环境中写

走近并发编程之一 进程和线程

并发与并行,进程与线程不仅是操作系统中及其重要的概念,也是并发编程入门 必须要理解的核心知识. 什么是并发?并发与并行的区别 顺序编程:程序中的所有事物在任意时刻都只能执行一个步骤 并发:在同一时间段内,需要处理多个任务,而在每个时间点又只能处理一个,这就是并发. 假设我们要把多个任务分配给处理机,如果这台机器有多个处理器,显然可以同时执行这些任务,这就是并行. 不同于并行,并发的目的旨在最大限度的提高程序在单处理器上的效率.前者是在物理上的同时发生,而并发是在逻辑上的同时发生.如图,如果要在同

9)网络并发 编程、进程、线程和协程

并发网络 Server: #!/usr/bin/env python#-*-conding:utf-8-*-import socketsk = socket.socket()sk.bind(('127.0.0.1',9009))sk.listen()conn,addr = sk.accept()conn.send(b'heooo')msg = conn.recv(1024)print(msg)conn.close()sk.close() Client: #!/usr/bin/env python

Python并发编程之进程

一.理论概念 1.定义 进程(Process 也可以称为重量级进程)是程序的一次执行.在每个进程中都有自己的地址空间.内存.数据栈以及记录运行的辅助数据,它是系统进行资源分配和调度的一个独立单位. 2.并行和并发 并行:并行是指多个任务同一时间执行: 并发:是指在资源有限的情况下,两个任务相互交替着使用资源: 3.同步和异常 同步是指多个任务在执行时有一个先后的顺序,必须是一个任务执行完成另外一个任务才能执行: 异步是指多个任务在执行时没有先后顺序,多个任务可以同时执行: 4.同步/异步/阻塞/

python并发编程之进程池,线程池concurrent.futures

进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的进程数或线程数加以控制,让机器在一个自己可以承受的范围内运行,这就是进程池或线程池的用途, 例如进程池,就是用来存放进程的池子,本质还是基于多进程,只不过是对开启进程的数目加上了限制 Python--concurrent.fu

python并发编程之进程池,线程池

要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉只要你用并发,就会有锁的问题,但是你不能一直去自己加锁吧那么我们就用QUEUE,这样还解决了自动加锁的问题由Queue延伸出的一个点也非常重要的概念.以后写程序也会用到这个思想.就是生产者与消费者问题 一.Python标准模块--concurrent.futures(并发未来) concurent.future模块需要了解的1.concurent.fut

并发编程:进程池,多线程。

一 守护进程的应用:其实还是在我们生产者与消费者的模型上加上守护进程的概念,使得我们的进程能够在任务执行完之后正常的退出. import time import random from multiprocessing import Process,JoinableQueue #我们在这里导入一个joinableQueue模块, def consumer(name,q): while True: res=q.get() if res is None:break time.sleep(random.