并发编程:进程、多道、进程执行顺序与常用属性

一、进程与多道技术

二、主程序

三、进程理论

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

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

六、开启子进程的方式

七、进程对象常用属性

 

一、进程与多道技术

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

二、主程序

from multiprocessing import Process
import  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  Process
import 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()
    print("我是主进程!!!")
    time.sleep(100)
    print("我是主进程!!! over")



# 主进程一定是先是
# 一旦启动子进程 后续的代码就并发 没有先后顺序
# 如果父进程需要等待子进程结束后才能执行

 

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

from multiprocessing import  Process
import 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()
#











# 记住语法就ok
class MyProcess(Process):

    def run(self):
        print("你要做的事情 放在run中!")
if __name__ == '__main__':
    MyProcess().start()
    print("")

 

 

七、进程对象常用属性

from multiprocessing import  Process
import  time


def 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值