三十三、进程理论

一、进程理论

1、程序和进程

程序:一堆代码

进程:正在运行的程序

进程是一个实体,每一个进程都有它自己独立的内存空间

2、同步和异步:针对任务的提交方式

同步:提交任务之后,原地等待任务的返回结果,期间不做任何事(叫人吃饭,一直等待)

异步:提交任务之后,不等待任务的返回结果,执行运行下一行代码(叫人吃饭,但自己先走)

3、阻塞与非阻塞:针对程序运行的状态

阻塞:遇到io操作 ->>阻塞态

非阻塞:就绪或者运行态

二、创建进程的两种方式

1、方式一

from multiprocessing import Process
import time

def task(name):
    print(‘%s is running‘ % name)
    time.sleep(3)
    print(‘%s is over‘ % name)

# 注意,在windows系统中,创建进程会将代码以模块的方式从头到尾加载一遍
# 一定要写在if __name__ == ‘__main__‘:代码块里面
# 强调:函数名一旦加括号,执行优先级最高,立刻执行
if __name__ == ‘__main__‘:
    p1 = Process(target=task, args=(‘egon‘,))   # # 这一句话只是实例化了一个Process对象
    p1.start()     # 告诉操作系统创建一个进程
    print(‘主进程‘)

2、方式二

from multiprocessing import Process
import time

class MyProcess(Process):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(‘%s is running‘ % self.name)
        time.sleep(1)
        print(‘%s is end‘ % self.name)

if __name__ == ‘__main__‘:
    obj = MyProcess(‘egon‘)
    obj.start()
    print(‘主进程‘)

三、join方法:join主进程等待子进程结束 才继续运行

from multiprocessing import Process
import time

def task(name, n):
    print(‘%s is running‘ % name)
    time.sleep(n)
    print(‘%s is end‘ % name)

if __name__ == ‘__main__‘:
    start_time = time.time()
    p_list = []
    for i in range(3):
        p = Process(target=task, args=(‘子进程%s‘ % i, i))
        p.start()
        p_list.append(p)
    for i in p_list:
        i.join()
    print(‘主进程‘, time.time()-start_time)

# 结果为
# 子进程0 is running
# 子进程0 is end
# 子进程1 is running
# 子进程2 is running
# 子进程1 is end
# 子进程2 is end
# 主进程 2.624150037765503

四、进程对象其他方法

# 了解
from multiprocessing import Process, current_process
import time
import os

def task():
    print(‘%s is running‘ % os.getpid())
    time.sleep(3)
    print(‘%s is over‘ % os.getppid())

if __name__ == ‘__main__‘:
    p1 = Process(target=task)
    p1.start()
    p1.terminate()  # 杀死子进程
    time.sleep(0.1)
    print(p1.is_alive())  # 判断子进程是否存活
    print(‘主‘)

五、进程之间内存隔离

# 记住 进程与进程之间数据是隔离的!!!
from multiprocessing import Process

x = 100
def task():
    global x
    x = 20
    print(‘子进程‘, x)

if __name__ == ‘__main__‘:
    p = Process(target=task)
    p.start()
    p.join()
    print(‘主进程‘, x)

# 结果为
# 子进程 20
# 主进程 100

六、守护进程

from multiprocessing import Process
import time

def task(name):
    print(‘%s正活着‘ % name)
    time.sleep(3)
    print(‘%s正常死亡‘ % name)

if __name__ == ‘__main__‘:
    p = Process(target=task, args=(‘egon总管‘,))
    p.daemon = True
    p.start()
    print(‘jason正在死亡‘)

# 结果为 jason正在死亡

七、互斥锁

互斥锁(***)
①锁千万不要随意去用
②牺牲了效率但是保证了数据的安全
③锁一定要在主进程中创建,给子进程去用
④解决多个进程操作同一份数据,造成数据不安全的情况
⑤加锁会将并发变成串行
⑥锁通常用在对数据操作的部分,并不是对进程全程加锁
mutex.acquire()  # 抢锁   一把锁不能同时被多个人使用,没有抢到的人,就一直等待锁释放
buy(i)
mutex.release()  # 释放锁
from multiprocessing import Process, Lock
import json
import time
import random

def search(i):
    with open(‘info‘, ‘r‘, encoding=‘utf-8‘) as f:
        data = json.load(f)
    print(‘用户查询余票数%s‘ % data.get(‘ticket‘))

def buy(i):
    # 买票之前还得先查有没有票!
    with open(‘info‘, ‘r‘, encoding=‘utf-8‘) as f:
        data = json.load(f)
    time.sleep(random.randint(1, 3))   # 模拟网络延迟
    if data.get(‘ticket‘) > 0:
        data[‘ticket‘] -= 1   # 买票

        with open(‘info‘, ‘w‘, encoding=‘utf-8‘) as f:
            json.dump(data, f)
        print(‘用户%s抢票成功‘ % i)
    else:
        print(‘用户%s查询余票为0‘ % i)

def run(i, mutex):
    search(i)
    mutex.acquire()  # 抢锁   一把锁不能同时被多个人使用,没有抢到的人,就一直等待锁释放
    buy(i)
    mutex.release()  # 释放锁

if __name__ == ‘__main__‘:
    mutex = Lock()       # 创建锁
    for i in range(5):
        p = Process(target=run, args=(i, mutex))
        p.start()

# 结果为
# 用户查询余票数3
# 用户查询余票数3
# 用户查询余票数3
# 用户查询余票数3
# 用户查询余票数3
# 用户1抢票成功
# 用户0抢票成功
# 用户2抢票成功
# 用户3查询余票为0
# 用户4查询余票为0

原文地址:https://www.cnblogs.com/zhangguosheng1121/p/10822825.html

时间: 2024-11-10 14:11:18

三十三、进程理论的相关文章

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

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

数据表三范式&范式理论

范式理论 ????范式理论为了解决数据的冗余与不一致,达到节省空间的作用. 1NF ????原子性(Atomicity),原子性说的就是,表中的字段不可再折分.每一个字段都是一个最基本的数据. ????上表在使用中没有太大的问题,但是如果想查询开始时间,那么要先读取起止时间,再使用程序进行拆分.这样会降低程序的执行效率.由于起止时间可以再折分,所以违背了范式第一理论. 解决方法: ????将起止时间拆分为两个字段. 2NF ????2NF前提必须是满足1NF ????表中的非主键字段不可以存在依

iOS开发——错误总结篇&开发中常见错误和警告总结(三十三)

开发中常见错误和警告总结(三十三) 动画冲突 错误: Unbalanced calls to begin/end appearance transitions for <uivewcontroller> 解决方法1:去掉动画 解决方法2:监听当前view的动画是否完成 解决方法就是,加一个BOOL型的变量,检查是否在做动画. 1 2 if (transiting) { 3 return; 4 } 5 transiting = YES; 6 [self transitionFromViewCon

NeHe OpenGL教程 第三十三课:TGA文件

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十三课:TGA文件 加载压缩和未压缩的TGA文件: 在这一课里,你将学会如何加载压缩和为压缩的TGA文件,由于它使用RLE压缩,所以非常的简单,你能很快地熟悉它的. 我见过很多人在游戏开发论坛或其它地方询问关于TGA读取的问题.

JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录

JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Socket和ServiceSocket 建立客户端和服务端 建立连接后,通过Socket中的IO流进行数据的传输 关闭Socket 同样的,我们的客户端和服务端都是两个独立的应用 我们通过查阅API文档发现,该对象在建立的时候,就可以去连接指定主机,因为tcp是面向连接的,所以在建立socket服务时,

【Unity 3D】学习笔记三十三:游戏元素——天空盒子

天空盒子 一般的3D游戏都会有着北京百年一遇的蓝天,让人惊叹不已.其实天空这个效果没有什么神秘的只需用到天空盒子这个组件就行,可以将天空设想成一个巨大的盒子,这个盒子将整个游戏视图和所有的游戏元素包含其中.在unity中制作天空盒子非常方便,只需要像设置其他组件一样设置下就行了.在制作天空盒子之前,我们需要搜集一些天空的贴图,不过,unity很方便的为开发者提供了天空盒子的资源包.首先在project视图中点击鼠标右键,然后选择import package--skyboxes即可添加天空盒子的资

Welcome to Swift (苹果官方Swift文档初译与注解三十三)---235~240页(第五章-- 函数)

Default Parameter Values (参数默认值) 在定义函数的时候,你可以给任何参数定义一个默认的值,如果定义了默认值,在调用这个函数的时候,你可以忽略这个参数. 注意: 设置参数默认值的时候,需要按照函数的参数列表最后的开始,这可以确保在调用函数的时候,即使没默认值的参数也可以按顺序的对应上,也使得函数在调用的时候更加清晰. 下面的代码例子是join函数的新版本,它使用了默认参数: func join(string s1: String, toString s2: String

三十三、Java图形化界面设计——布局管理器之null布局(空布局)

摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有默认布局方式,但是有时候需要精确指定各个组建的大小和位置,就需要用到空布局. 操作方法: 1)       首先利用setLayout(null)语句将容器的布局设置为null布局(空布局). 2)       再调用组件的setBounds(int x, int y, int width,int

第三十三天 我为集成平台狂(六)-步履轻盈的JQuery(四)

6月28日,阴转雨." 微雨过,小荷翻,榴花开欲燃.玉盆纤手弄清泉,琼珠碎却圆."          古老的JavaScript,且乱且复杂,封装成库,青春焕发,这样人们就可以品尝到原汁原味的JQuery,地道的Dojo,或是正宗的ExtJS大餐....来自全球各地JS框架的交汇,口味和风格也日益趋同,然而,总有新的创造和惊喜,那是我们乐此不疲的原因 . 日本人开始吃饭的时候,总要说一句"我开动了!".那么,JQuery是怎么自己开动的?困扰很多初学者, "