【python学习笔记】第5天

继续今天的python学习

上来先了解了pdb调试,和gdb类似(调试c/c++的工具)用法也很简单,主要就是一些命令需要去记,一下是从网络上收集的pdb调试命令:

完整命令简写命令描述
argsa打印当前函数的参数
breakb设置断点
clearcl清除断点
condition设置条件断点
continuec或者cont继续运行,知道遇到断点或者脚本结束
disable禁用断点
enable启用断点
helph查看pdb帮助
ignore忽略断点
jumpj跳转到指定行数运行
listl列出脚本清单
nextn执行下条语句,遇到函数不进入其内部
pp打印变量值,也可以用print
quitq退出 pdb
returnr一直运行到函数返回
tbreak设置临时断点,断点只中断一次
steps执行下一条语句,遇到函数进入其内部
wherew查看所在的位置
!在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()终止进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值