进程及Python实现

进程杂谈

#进程就是正在执行的一个过程,是对正在运行程序的一个抽象

#进程由程序、数据集和进程控制块(最重要的,进程切换  状态如何保存,恢复和记录)组成

"""
进程调度:
    1.先来先服务
    2.短作业优先调度
    3.时间片轮转法
    4.多级反馈队列

进程遇到IO就会被挂起
"""

'''
将一个单独的cpu变成多个
虚拟的cpu(多道技术:时间多路复用和空间
多路复用+硬件上支持隔离)
没有进程的抽象,现代计算机将不复存在
'''

'''
操作系统的作用:
    1.隐藏丑陋复杂的硬件接口,提供良好的抽象接口
    2.管理,调度进程,并且将多个进程对硬件的竞争变得有序
'''

'''
多道技术:
    1.产生背景:针对单核,实现并发
    ps:现在的主机一般是多核,那么每个核都会利用多道技术
    空间复用
    时间复用
'''

'''
同步和异步是通讯方式,阻塞和非阻塞是等待状态
同步 阻塞:发出消息,不回就傻等。跟女神聊天,站在一旁等,什么都不干
同步 非阻塞:发消息,不回就等,但是干别的事情。跟女神聊天,站在一旁等,一边吃饭一边回头看看手机等消息
异步 非阻塞:发消息,不回消息也不等,就去干别的。跟女神聊天,不回我就去外面打篮球,等听到电话响了就去聊天
异步 阻塞:发消息,不回也不等,但是也不干别的。跟女神聊天,不回我就在屋里想其他美女,啥也不干。

'''

"""
串行
并发    切换+保存状态
并行

CPU切换

开启子进程的原因是为了支持并发

#这是一个函数,也相当于一个作业,
执行时开启一个子进程,会把父进程整个放到新的名称空间里面执行
,所以x=1也会放进去

x = 1
def task():
    print(x)

主进程会等子进程全部运行结束才会结束

#僵尸进程:父进程的子进程结束的时候父进程没有wait()情况下子进程会变成僵尸进程,即子进程先结束,父进程未回收子进程,没有释放子进程占用的资源

#孤儿进程:一个父进程退出,它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将会被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作(是无害的)

#父进程等着子进程都死,回收僵尸进程,也是无害的

#父进程一直不死,造成了大量僵尸进程,占用了大量的pid号,是有害的,因为pid号是有限的,最简单的解决办法就是杀死父进程

python实现开启进程

# multiprocess模块:其实是一个操作管理进程的包,
# 包括创建进程部分,进程同步部分,进程池部分,
# 进程之间的数据共享

#下面的代码会报错,因为子进程会把父进程的代码拷贝运行,再生成子进程在拷贝,,,,类似递归

from multiprocessing import Process
import time

def task():
    print('进程 start')
    time.sleep(2)
    print('进程 end')

p = Process(target=task)#实例化出来对象,向操作系统发送开启子进程的请求,还没开启子进程。
p.start()#告诉操作系统我要开启子进程

#01 开启子进程的方式一(调用模块改进执行方法,加__name__ = __main__)

from multiprocessing import Process
import time

def Study(name, age):
    print(f'{name}启动了子进程1')
    print(f'{name}的年龄是{age}')

def Play(name,age):
    print(f'{name}启动了子进程2')
    print(f'{name}的年龄是{age}')

if __name__ == '__main__':
    p = Process(target=Study, args=('nick', 18))
    p2 = Process(target=Play, args=('tank', 49))
    p.start() #只是发送请求开启子进程,
    # time.sleep(2)
    p2.start()#只是发送请求开启子进程,
    print('执行了父进程') #按顺序执行下来,比上面两个start要先执行

#开启子进程的方式二(写一个类继承Process类)
from multiprocessing import Process

class Study(Process):
    def __init__(self, name):
        super().__init__()  #写完这个,下面的name又变成了Test-2
        self.name = name
        print(name)
    def run1(self, v):
        self.v = v
        print(f'{self.name}的跑步速度是{v}')

if __name__ == '__main__':
    p = Study('nick')
    p.start()
    p.run1(29)

#3 验证进程的内存空间隔离
from multiprocessing import Process
import time

x = 0
def task():
    global x
    x = 100
    print(f'子进程的x修改为了{x}')
if __name__ == '__main__':
    p = Process(target=task)
    p.start()
    time.sleep(3)
    print(x) #先打印100,再打印0

原文地址:https://www.cnblogs.com/michealjy/p/11517005.html

时间: 2024-10-11 13:38:45

进程及Python实现的相关文章

01python 中的进程(python并发编程)

00.进程 span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }.cm-s

线程与进程 | GIL | Python

# 进程:系统进行资源调度的基本单元: # 一个程序在一个数据集上一次动态执行过程: # 进程:程序,数据集,进程控制块: # 1.程序:描述进程功能的完成: # 2.数据集:程序在执行过程中需要使用的资源: # 3.进程控制块:描述进程执行的变化过程,用来系统控制管理进程: # 线程:CPU调度的基本单元:轻量级的进程: # 作用:减少程序并发执行的开销,提高性能: # 线程没自由自己的系统资源: # join() # 子线程未执行结束,主线程就一直处于阻塞状态: # setDaemon(Tr

python开发学习-day08(socket高级、socketserver、进程、线程)

s12-20160305-day08 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin

使用 gdb 调试运行中的 Python 进程

本文和大家分享的是使用 gdb 调试运行中的 Python 进程相关内容,一起来看看吧,希望对大家学习python有所帮助. 准备工作 安装 gdb 和 python2.7-dbg: $ sudo apt-get install gdb python2.7-dbg 设置 /proc/sys/kernel/yama/ptrace_scope: $ sudo su# echo 0 > /proc/sys/kernel/yama/ptrace_scope 运行 test.py: $ python te

python线程、进程和协程

链接:http://www.jb51.net/article/88825.htm 引言 解释器环境:python3.5.1 我们都知道python网络编程的两大必学模块socket和socketserver,其中的socketserver是一个支持IO多路复用和多线程.多进程的模块.一般我们在socketserver服务端代码中都会写这么一句: server = socketserver.ThreadingTCPServer(settings.IP_PORT, MyServer) Threadi

python学习进程和线程中碰到的问题以及问题解惑

python中的os.getpid() os.getpid()是获取的是当前进程的进程号,os.getppid()是获取当前进程的父进程的进程号 python 中__name__ = '__main__' 的作用 eg: def main(): print "we are in %s"%__name__ if __name__ == '__main__': main() 这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出"we are in __main_

Python 线程(threading) 进程(multiprocessing)

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

Python写自动化之启动进程并获取进程输出

当我们需要执行外部命令或自己写一个自动化执行器时,需要使用到启动进程并获取输出的操作 首先,我们启动进程采用Python的subprocess模块,为了保证标准输出和标准错误输出能够正常运行,启动两个线程来检测输出结果部分 class Daemon(threading.Thread): def __init__(self, workDir, logFunction=None, *args): threading.Thread.__init__(self) self.process = None

python之线程、进程和协程

引言 解释器环境:python3.5.1我们都知道python网络编程的两大必学模块socket和socketserver,其中的socketserver是一个支持IO多路复用和多线程.多进程的模块.一般我们在socketserver服务端代码中都会写这么一句:server = socketserver.ThreadingTCPServer(settings.IP_PORT, MyServer)ThreadingTCPServer这个类是一个支持多线程和TCP协议的socketserver,它的