继续今天的python学习
上来先了解了pdb调试,和gdb类似(调试c/c++的工具)用法也很简单,主要就是一些命令需要去记,一下是从网络上收集的pdb调试命令:
完整命令 | 简写命令 | 描述 |
args | a | 打印当前函数的参数 |
break | b | 设置断点 |
clear | cl | 清除断点 |
condition | 无 | 设置条件断点 |
continue | c或者cont | 继续运行,知道遇到断点或者脚本结束 |
disable | 无 | 禁用断点 |
enable | 无 | 启用断点 |
help | h | 查看pdb帮助 |
ignore | 无 | 忽略断点 |
jump | j | 跳转到指定行数运行 |
list | l | 列出脚本清单 |
next | n | 执行下条语句,遇到函数不进入其内部 |
p | p | 打印变量值,也可以用print |
quit | q | 退出 pdb |
return | r | 一直运行到函数返回 |
tbreak | 无 | 设置临时断点,断点只中断一次 |
step | s | 执行下一条语句,遇到函数进入其内部 |
where | w | 查看所在的位置 |
! | 无 | 在pdb中执行语句 |
今天用到了几个常用的命令来调试下面这段简单的代码
def test(a,b):
res = a+b
return res
a = 100
b = 200
res = test(a,b)
print(res)
在ubuntu中我们用以下命令来调试我们的代码
python3 -m pdb pdbcmd.py
pdb调试还有两种方法
一种是在交互过程中利用pdb.run("函数调用")来进行调试,另一种就是使用pdb.set_trace()中进行调试,一般都是用第一种,所以后两种就不记录了。。。
接下来学习了python的编码风格,这个也不记录了。。。
接着就是多任务(进入到了系统编程了),多任务实现的原理就是每一个程序都运行很短暂的时间然后下一个程序运行,我们可以称之为时间片轮转,当时间片足够小或者说轮转的速度足够快的时候,就好像程序一直都没停止一样,这样就实现了多任务。
在linux系统上我们可以使用os模块下的fork()来实现多进程(Windows系统没有这样的一个接口,所以不能使用)
import os
res = os.fork()
if res == 0:
print("I'm a child")
else:
print("I'm a father")
运行结果:
I'm a child
I'm a father
可以看到结果有两个,在这里其实fork创建了一个子进程(值为0),我们接下来看一下它的PID
import os
res = os.fork()
if res == 0:
print("I'm a child")
print("my PID:%s"%os.getpid())
else:
print("I'm a father")
print("my PID:%s"%os.getpid())
运行结果:
I'm a father
I'm a child
my PID:16086
my PID:16085
从结果可以看出两个进程是并行的。
我们知道子进程的值为0,那么父进程的值是多少呢,我们再来研究一下
import os
res = os.fork()
if res == 0:
print("I'm a child")
print("child PID:%s"%os.getpid())
else:
print(res)
print("I'm a father")
print("father PID:%s"%os.getpid())
运行结果:
16209
I'm a child
I'm a father
child PID:16209
father PID:16208
从结果可以看出父进程res的值就是子进程的PID。
接下来的问题就是父进程和子进程之间的执行顺序的问题,执行顺序是根据系统的调度算法来决定的,也就是不一定,而且fork()产生的子进程和父进程之间没有太多的绑定关系,也就是说各自执行各自的。
那么在Windows下我们要如何去创建多进程呢,用到了一个新的模块叫做multiprocessing
里面有一个类Process为我们提供了接口
from multiprocessing import Process
import time
def test():
for i in range(5):
print("I'm a childprocess")
time.sleep(1)
print("hello world")
p = Process(target = test)
p.start()
p.join(2)
print("----main----")
运行结果不记录了,因为有sleep
不过简单文字记录一下,用multiprocessing模块的Process类来创建一个实例对象,这个对象是一个单独的进程,和fork不一样的是父进程会等到所有子进程结束之后才会结束。
join([timeout])方法是一个 如果不传参就是等到子进程执行完毕之后再执行主进程,如果传参,那么只要超过这个参数的时间主进程也会执行,上课的时候老师打了一个比方很恰当。。。相当于过了这个时间就撕票。。。自行脑补
还有一个方法是terminate()终止进程。