python并发编程(进程操作)

一. multiprocess模块

仔细说来,multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。

process模块介绍

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

二. 使用process模块创建进程

1.第一种:

import os
from multiprocessing import Process
def func(*args):
    print(args)
    print(‘子进程‘,os.getpid())
    print(‘子进程的父进程‘,os.getppid())
if __name__ == ‘__main__‘:
    p = Process(target=func,args=(‘参数1‘,‘参数2‘))
    p.start()
    p.join()    # 感知一个子进程的结束,将异步的程序改为同步
    print(‘主进程‘, os.getpid())
    print(‘主进程的父进程‘, os.getppid())

2. 第二种

import os
from multiprocessing import Process
class MyProcess(Process):
    def __init__(self,args1,args2):
        super().__init__()
        # Process.__init__(self)
        self.args1 = args1
        self.args2 = args2

    def run(self):
        print(111)
        print(self.args1)
        print(self.args2)
        print(self.pid)

if __name__ == ‘__main__‘:
    p = MyProcess(‘参数1‘,‘参数2‘)
    p.start()
    print(os.getpid())

创建多个子进程

import os
from multiprocessing import Process
def func(filename,count):
    with open(filename,‘w‘,encoding=‘utf-8‘) as f:
        f.write(count*10*‘*‘)

if __name__ == ‘__main__‘:
    p_list = []
    for i in range(10):
        p = Process(target=func,args=(‘userinfo%d‘%i,i))
        p_list.append(p)
        p.start()
    [p.join() for p in p_list]
    print([i for i in os.walk(r‘e:\python10\day37‘)])

三. 进程之间的数据隔离问题

import os
import time
from multiprocessing import Process

def func():
    global n
    n = 0
    print(‘pid:%s‘%os.getpid(),n)

if __name__ == ‘__main__‘:
    n = 100
    p= Process(target=func)
    p.start()
    p.join()
    print(n)

四. 守护进程

import os
import time
from multiprocessing import Process

def func():
    while True:
        print(‘子进程开始‘)
        time.sleep(1)
        print(‘***我还在运行‘)

if __name__ == ‘__main__‘:
    p = Process(target=func)
    p.daemon = True
    p.start()
    p1 = Process(target=func)
    p1.start()
    p1.terminate()
    print(p1.is_alive())
    time.sleep(5)
    print(p1.is_alive())

五. 锁 —— multiprocess.Lock

加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。

虽然可以用文件共享数据实现进程间通信,但问题是:

1.效率低(共享数据基于文件,而文件是硬盘上的数据)

2.需要自己加锁处理

因此我们最好找寻一种解决方案能够兼顾:

1、效率高(多个进程共享一块内存的数据)

2、帮我们处理好锁问题。这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。 队列和管道都是将数据存放于

内存中 队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来, 我们应该尽量避免使用共享数据,尽可能使用消息传递

和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。

import time
import json
from multiprocessing import Process
from multiprocessing import Lock

def show_ticket(i):
    with open(‘ticket‘) as f:
        dic = json.load(f)
        print(‘余票:%s‘%dic[‘ticket‘])

def buy_ticket(i,lock):
    lock.acquire()
    with open(‘ticket‘) as f:
        dic = json.load(f)
        print(‘余票:%s‘ % dic[‘ticket‘])
        time.sleep(0.1)
    if dic[‘ticket‘] > 0:
        dic[‘ticket‘] -= 1
        print(‘\033[32m%s买到票了\033[0m‘%i)
    else:
        print(‘\033[31m%s买到票了\033[0m‘%i)
    time.sleep(0.1)
    with open(‘ticket‘,‘w‘) as f:
        json.dump(dic,f)
    lock.release()

if __name__ == ‘__main__‘:
    for i in range(10):
        p = Process(target=show_ticket,args=(i,))
        p.start()
    lock = Lock()
    for j in range(10):
        p = Process(target=buy_ticket,args=(j,lock))
        p.start()

原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8654104.html

时间: 2024-07-30 03:13:47

python并发编程(进程操作)的相关文章

python并发编程-进程理论-进程方法-守护进程-互斥锁-01

操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) 联机批处理系统 脱机批处理系统 多道程序系统 1.空间上的复用 ? 多个程序公用一套计算机硬件 2.时间上的复用 ? 切换+保存状态 ? 保存状态:保存当前的运行状态,下次接着该状态继续执行 ? 切换的两种情况 ? (1) 当一个程序遇到 I/O 操作(不需要使用CPU),操作系统会剥夺该程序的C

Python并发编程-进程 线程 协程

一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据集:数据集则是程序在执行过程中所需要使用的资源 3.进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感 知进程存在的唯一标志. 二.线程                                                                        

Python并发编程—进程

多任务编程 1.意义: 充分利用计算机多核资源,提高程序的运行效率. 2.实现方案 :多进程 , 多线程 3.并行与并发 并发 : 同时处理多个任务,内核在任务间不断的切换达到好像多个任务被同时执行的效果,实际每个时刻只有一个任务占有内核. 并行 : 多个任务利用计算机多核资源在同时执行,此时多个任务间为并行关系. 进程(process) 进程理论基础 1.定义 : 程序在计算机中的一次运行. 程序是一个可执行的文件,是静态的占有磁盘. 进程是一个动态的过程描述,占有计算机运行资源,有一定的生命

python并发编程--进程--其他模块-从菜鸟到老鸟(三)

concurrent模块 1.concurrent模块的介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor:进程池,提供异步调用 ProcessPoolExecutor 和 ThreadPoolExecutor:两者都实现相同的接口,该接口由抽象Executor类定义. 2.基本方法 submit(fn, *args, **kwargs) :异步提交任务 map(func,

Python并发编程-进程间数据共享

Manager中进程数据不安全 通过加锁解决 from multiprocessing import Manager,Process,Lock def main(dic,lock): lock.acquire() dic['count'] -=1 print(dic) lock.release() if __name__ == '__main__': m = Manager() l = Lock() dic = m.dict({'count':100}) #主进程中数据提供到子进程去操作 p_l

Python并发编程-进程池

为什么有进程池的概念 效率问题 每次开启进程,都需要开启属于这个进程的内存空间 寄存器,堆栈 进程过多,操作系统的调度 进程池 python中的 先创建一个属于进程的池子 这个池子指定能存放多少进程 先将这些进程创建好 更高级的进程池 3,20 默认启动3个进程 处理能力不够的时候,加进程 最多20个 python中没有 from multiprocessing import Pool,Process import time #Process就无需使用了 def func(n): for i i

Python并发编程—进程池

进程池实现 1.必要性[1] 进程的创建和销毁过程消耗的资源较多[2] 当任务量众多,每个任务在很短时间内完成时,需要频繁的创建和销毁进程.此时对计算机压力较大[3] 进程池技术很好的解决了以上问题. 2.原理 创建一定数量的进程来处理事件,事件处理完进 程不退出而是继续处理其他事件,直到所有事件全都处理完毕统一销毁.增加进程的重复利用,降低资源消耗. 3.进程池实现 [1] 创建进程池对象,放入适当的进程 from multiprocessing import Pool Pool(proces

进程,操作系统,Python并发编程之多进程

1.进程基础知识 1.程序:若干文件 2.进程:一个正在执行的文件,程序 3.进程被谁执行:cpu最终运行指定的程序 4.操作系统调度作用:将磁盘上的程序加载到内存,然后交由CPU去处理,一个CPU正在运行的一个程序,就叫开启了一个进程 2.操作系统 1.操作系统:存在于硬盘与软件之间,管理.协调.控制软件与硬件的交互 2.操作系统的作用:将一些复杂的硬件封装成简单的借口,便于使用;合理地调度分配多个进程与cpu的关系,让其有序化 3.操作系统发展史 ①第一代电子计算机(1940-1955) 二

Python并发编程03/僵尸孤儿进程,互斥锁,进程之间的通信

目录 Python并发编程03/僵尸孤儿进程,互斥锁,进程之间的通信 1.昨日回顾 2.僵尸进程和孤儿进程 2.1僵尸进程 2.2孤儿进程 2.3僵尸进程如何解决? 3.互斥锁,锁 3.1互斥锁的应用 3.2Lock与join的区别 4.进程之间的通信 进程在内存级别是隔离的 4.1基于文件通信 (抢票系统) 4.2基于队列通信 Python并发编程03/僵尸孤儿进程,互斥锁,进程之间的通信 1.昨日回顾 1.创建进程的两种方式: 函数, 类. 2.pid: os.getpid() os.get

Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池

目录 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 2.死锁现象与递归锁 2.1死锁现象 2.2递归锁 3.信号量 4.GIL全局解释器锁 4.1背景 4.2为什么加锁 5.GIL与Lock锁的区别 6.验证计算密集型IO密集型的效率 6.1 IO密集型 6.2 计算密集型 7.多线程实现socket通信 7.1服务端 7.2客户端 8.进程池,线程池 Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池 1.昨日回顾 #生产者消