博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发编程:进程、多道、进程执行顺序与常用属性
阅读量:5267 次
发布时间:2019-06-14

本文共 4276 字,大约阅读时间需要 14 分钟。

一、进程与多道技术

二、主程序

三、进程理论

四、主进程与子进程的执行顺序

五、父进程等待子进程结束

六、开启子进程的方式

七、进程对象常用属性

 

一、进程与多道技术

什么是进程
    一个正在运行的程序称之为进程
        是一种抽象概念 表示一个执行某件事情的过程
    进程的概念 起源于操作系统
    第一代计算机  程序是固定 无法修改 某种计算机只能干某种活
    第二代批处理系统 需要人工参与  将程序攒成一批 统一执行
        串行执行 提高计算机的的利用率  但是调试麻烦
    第三代计算机 为了更好利用计算机资源,产生了
    多道技术:  ******
      1.空间复用
        内存分割为多个区域 每个区域存储不同的应用程序
      2.时间的复用
        1.当一个程序遇到了I/O操作时 会切换到其他程序 (切换前需要保存当前运行状态 以便恢复执行)
            提高效率
        2.当你的应用程序执行时间过长 操作系统会强行切走 以保证其他程序也能正常运行 当然因为cpu速度贼快 用户感觉不到
            降低效率
        3.有一个优先级更高的任务需要处理 此时也会切走
            降低了效率
        我们编写程序时 只能尽量减少I/O操作
    总的来说 有了多道技术之后 操作系统可以同时运行多个程序吧 这种情形称之为并发
    但是本质好 这些程序还是一个一个排队执行
    并发
        在同一个时间段内 发生的多个事情
    并行
        在同一时刻 同时进行多个事情
    串行
        许多任务排队执行
        第一个任务没执行完   第二个只能等待
        此时不叫阻塞 因为CPU执行权还在手里 依然在执行你的代码
        第一个任务做不下去 i/o操作 此时就是阻塞 因为cpu被分配给其他进程
        总结一下:只要还拥有cpu的执行权 就不叫阻塞
    非阻塞
    同步 和 异步
       print("asasasasassasasasasasasdfsfsdfsdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
       print("over")
       input(">>>>:")

二、主程序

from multiprocessing import Processimport  time,os# def task(name):#     print("process running")#     time.sleep(3)#     print("process stop")# if __name__ == '__main__':#     # 为毛创建进程#     # 1.创建一个进程对象 需要传入你要做的任务 就是一个函数对象#     p = Process(target=task)#     # 2.启动它#     p.start()# 当你完成的任务需要参数时def task(name):    print(name," running")    time.sleep(3)    print(name," stop")print(__name__)# windows 开启子进程 必须放到if中     只要你的开启子进程的代码处于全局 范围 你就应该放到if判断中if __name__ == '__main__':    # 为毛创建进程 为了帮父进程做事情    # 1.创建一个进程对象 需要传入你要做的任务 就是一个函数对象    p = Process(target=task,kwargs={
"name":"jerry"}) # 2.启动它 p.start() print(id(p)) print("我是主程序我的pid:%s 我的父进程是:%s" % (os.getpid(),os.getppid())) print("我有一个儿子是 %s" % p.pid)#

 

三、进程理论

进程和程序的区别
程序是什么?
    本质就是一堆代码文件!
    一个程序正在被操作系统读取并执行 就变成了进程
一个程序只能有一个进程吗?
    可以 启动一次就产生一个进程  当然可以用代码控制是否允许多进程
 
启动进程的方式
    1.系统初始化 会产生一个根进程
    2.用户的交互请求 鼠标双击某个程序
    3.在一个进程中 发起了系统调用启动了另一个进程 ******
    4.批处理作业开始 某些专用计算机可能还在使用
不同操作系统创建进程的方式不同
    unix <   centos mac  linux
        完全拷贝父进程的所有数据 子进程可以访问父进程的数据吗?不可以 但是可以访问拷贝过来数据副本
    windows
        创建子进程 加载父进程中所有可执行的文件
 

四、主进程与子进程的执行顺序

from multiprocessing import  Processimport timedef task(name):    print("%s start" % name)    time.sleep(3)    print("%s stop" % name)if __name__ == '__main__':    p = Process(target=task,args=("jerry",))    p.start()    print("我是主进程!!!")    time.sleep(100)    print("我是主进程!!! over")# 主进程一定是先是# 一旦启动子进程 后续的代码就并发 没有先后顺序# 如果父进程需要等待子进程结束后才能执行

 

五、父进程等待子进程结束

from multiprocessing import  Processimport time# def task(name):#     print("%s start" % name)#     time.sleep(3)##     print("%s stop" % name)## if __name__ == '__main__':#     p = Process(target=task,args=("jerry",))#     p.start()#     p.join(3)   #父进程必须等到子进程完成后才能继续执行  可设置等待超时时间#     print("我是主进程!!!")# def task(i):#     print("%s start" % i)#     # time.sleep(2)#     # print("%s stop" % i)## if __name__ == '__main__':#     for i in range(1,11):#         p = Process(target=task,args=(i,))#         p.start()#     print("主进程!!!!")# 我们的代码只负责 通知操作系统创建进程  创建完就继续其他代码# 但是操作系统什么时候创建完成 什么时候执行我们无法预知无法控制def task(i):    print("%s start" % i)    time.sleep(2)    print("%s stop" % i)if __name__ == '__main__':    start_time = time.time()    ps = []    for i in range(1,3):        p = Process(target=task,args=(i,))        p.start()        ps.append(p)        # 主进程等子进程结束    for p in ps:        p.join()    print("主进程!!!!",time.time()-start_time)

 

六、开启子进程的方式

#from multiprocessing import Process### class MyProcess(Process):#     # 当进程被执行时 其实执行的就是run函数#     def run(self):#         print("这是 run被执行了!")#### def ttt():#     print("11111")# if __name__ == '__main__':#     mp = MyProcess()#     mp.start()##     p = Process(target=ttt)#     p.start()## 记住语法就okclass MyProcess(Process):    def run(self):        print("你要做的事情 放在run中!")if __name__ == '__main__':    MyProcess().start()    print("主")

 

 

七、进程对象常用属性

from multiprocessing import  Processimport  timedef task(name):    print("start",name)    time.sleep(5)    print("stop",name)if __name__ == '__main__':   p = Process(target=task,args=("jerry",),name="jerrr process-1")   p.start()   # p.join() # 让父进程等待子进程结束  让父进程让出了CPU执行权   print(p.name)   print(p.pid) # 获取这个进程的id   p.terminate() # 结束子进程   print(p.is_alive()) # 进程是否还存活   # p这个进程的父进程 是7.进程对象常用属性.py这个进程   import os   print(os.getpid()) # 当前自己进程的id   print(os.getppid())# pycharm的进程id   #父进程如何获取子进程中数据  跨进程通讯

 

转载于:https://www.cnblogs.com/wuzhengzheng/p/10268551.html

你可能感兴趣的文章
委托和事件的简单实用
查看>>
面试题答案一
查看>>
arcgis 10.3 属性表乱码解决方案
查看>>
[转] Word2vec数学原理全家桶
查看>>
转:ArcGIS10.1正式版安装与破解
查看>>
国内代码托管
查看>>
sql进阶-筛选库表中数据为空的表
查看>>
ife task0003学习笔记(二):JavaScript原型
查看>>
SQL循环遍历,删除表里某一列是重复的数据,只保留一条。
查看>>
JAVA安装及环境变量配置
查看>>
WCF 第八章 安全 消息层安全
查看>>
WCF 第八章 安全 确定替代身份(下)-模仿用户
查看>>
ecshop 的transport.js 与jqueyr冲突
查看>>
css渲染(三)颜色与背景
查看>>
[ios] UIWebView的离线缓存【转】
查看>>
如何写复杂的SQL
查看>>
HNOI2002 营业额统计
查看>>
UE4之数组
查看>>
超分辨率的国内外研究现状
查看>>
PPP 转义字符 编码 和 解码
查看>>