python中进程详解

1:pdb调试:基于命令行的调试工具,非常类似gnu和gdb调试,以下是常用的调试命令:

                    可以python -m pdb xxx.py(你的py文件名)进入命令行调试模式

命令

简写命令

作用

beak

b

设置断点

continue

c

继续执行程序

扫描二维码关注公众号,回复: 5719164 查看本文章

list

l

查看当前行的代码段

step

S

进入函数

return

r

执行代码直到从当前函数返回

quit

q

中止并退出

next

n

执行下一行

print

p

打印变量的值

help

h

帮助

args

a

查看传入参数

 

回车

重复上一条命令

brerak

b

显示所有断点

break lineno

b lineno

在指定行设置断点

break file:lineno

B file:lineno

在指定文件行设置断点

clear num

 

删除指定断点

bt

 

查看函数调用栈帧

2:多任务的概念:在现实中人可以同时进行多个动作,在操作系统中同时进行多个任务就叫做多任务,提到多任务就想起了并发和并行。

  并发:任务数超过cpu的核数,日常生活中的大部分都是并发 。

  并行:任务数小于或等于cpu核数,任务都同时在进行着。 

3:fork创建进程(在linux操作系统中适用,在windows中python没有这种用法) 看一下这个小示例:

import os
ret = os.fork()
if ret == 0:
 print("1")
else:  print("2")

程序输出如下: 

root@ubuntu:/home/peng/py高级# python3 test.py 
2
1
root@ubuntu:/home/peng/py高级# 

你也许会好奇,怎么把1和2都输出了? 看如下解释:

-------------------------------------------------------华丽的分割线---------------------------------------------------

原来的进程叫做父进程,fork语句后生成子进程,而子进程生成后的ret的值为0,但父进程的ret是大于零的,所以父进程执行else语句的内容,子进程执行if后边的语句

所以打印的结果是2      1或者  1  2,但是都会出现1和2

根据系统调度不同输出的结果不同但都会输出

父进程与子进程谁先执行由系统决定,与系统决定相关的因素有:时间片轮转,优先级调度

说一个有趣的东西:fork炸弹 (轻易不要尝试,不然你的电脑可能会gameover)

import os
while True:
    os.fork()

会不停的创建新进程,一直到操作系统吧你这个程序干掉为止 ,切记fork炸弹不要乱用,WARNING

---------------------------------------华丽的分隔长线--------------------------------------------------------------------------------

4:Process(类):在windows和linux平台都可以,实现创建子进程的功能。看了如下代码你就会了解的:

from multiprocessing import Process    
import os
def run_proc(name):
print(“子进程运行中,name=%s,pid=%d…”%(name,os.getpid())
if __name__ == ‘__main__’:
	print(“父进程%d’%os.getpid())
	p = Process(target=run_proc,args=(‘test’,))
	print(‘子进程将要执行’)
	p.start()
	p.join()
	print(“子进程已结束“)

以上代码中导入相关模块,定义函数。

调用mutiprocessing模块中的Process类,使用Process(targer=xxx(函数名),args=(参数1,参数2,..))这里注意如果有一个参数在后边加一个逗号,在声明子进程后再子进程中调用run_proc函数,并把test作为字符串传给run_proc函数,start方法开启子进程,join()方法让父级进程等待子进程结束后在结束。

5:进程池(Pool)

首先在程序中导入Pool  :from multiprocessing import Pool

po=Pool(3)定义一个进程池最大进程数为3 

 po.apply_async(函数名,(传递给目标的参数元组))调用目标

po.close()关闭进程池,关闭后po不在接受新的请求

po.join()等待所有的子进程执行完成

看以下code:

from multiprocessing import Pool
import time
import os
import random
def test(num):
    for i in range(5):
        print("===pid=%d==num=%d"%(os.getpid(),num))
        time.sleep(1)
po = Pool(3)
for i in range(4):
    po.apply_async(test,(i,))
#po.join()
po.close()
po.join()

猜你喜欢

转载自blog.csdn.net/peng_for_csdn/article/details/88901609