目录:
1. 多线程练习
2. psutil初识
3. 小知识
目录【Python程序员都知道的入门知识】
1. 多线程练习
for循环启动五条线程,打印当前处于活跃状态的线程数量:
问题出现了,明明for循环五次,加上一条主线程也就才六条线程,怎么打印出来的却是 ''current has 7 threads'',多出一条是什么?
遍历出所有线程(如下图),可以看出多了一条SockThread 守护线程。
那么什么是SockThread,这个线程又是怎么出现的?
待续。。。
在追查过程中发现了一个模块:psutil
2. psutil初识
2.1. psutil是什么?
来看看官方说明:
psutil,即process and system utilities。
是一个用于检索当前正在运行的进程和系统资源使用情况(包括:CPU,内存,磁盘、网络等)的跨平台库。
目前在github上有超过4200个开源工程中使用到了psutil
官网中推荐了这个:Sample,可以参考着练一练。
2.2. 安装
我是在Windows 64下装了python2.7 ,所以我下载安装了:
psutil-5.0.1.win-amd64-py2.7.exe
psutil官方下载地址
psutil官方文档
2.3. 与系统相关的函数
2.3.1. CPU
处理器时间
1、psutil.cpu_times(percpu = False)
返回一个名为scputimes的元组
2、psutil.cpu_times(percpu = True)
返回一个名为scputimes的元组列表(每个CPU处理器的各种模式的时间)
实际返回的(无论是单个元组还是元组列表中的)元素也跟系统有关。以下是通有元素说明:
- user:处理器处理用户(Linux下包括游客)所用的时间
- system:处理器处理系统内核所用的时间
- idle:什么都不做所花的事
与平台相关的元素:
- nice 【UNIX】
- iowait 【Linux】
- irq【Linux,BSD】
- softirq 【Linux】
- steal 【Linux 2.6.11+】
- guest【Linux 2.6.24+】
- guest_nice 【Linux 3.2.0+】
- interrupt 【Windows】
- dpc 【Windows】
处理器使用频率
1、
psutil.cpu_percent(interval=None, percpu=False)
2、
psutil.cpu_times_percent(interval=None, percpu=False)
处理器数量
psutil.cpu_count(logical=True)
处理器数据
psutil.cpu_stats()
2.3.2. Memory
虚拟内存
psutil.virtual_memory()
交换内存
psutil.swap_memory()
2.3.3. Disks
磁盘分配
psutil.disk_partitions(all = False)
磁盘使用情况
psutil.disk_usage(path)
磁盘读写计数器
psutil.disk_io_counters(perdisk = False)
2.3.4. Network
网络读写计数器
psutil.net_io_counters(pernic = False)
网络连接
psutil.net_connections(kind = 'inet')
网络适配器关联的地址
psutil.net_if_addrs()
网络适配器数据
psutil.net_if_stats()
2.3.5. 其他系统信息
引导时间
psutil.boot_time()
系统当前用户
psutil.users()
2.4. psutil操作进程
2.4.1. 函数
正在运行的进程ID列表
psutil.pids()
(为避免出现竞争条件,不推荐使用)
根据进程ID判断进程是否在运行列表中
psutil.pid_exists(pid)
进程ID迭代器
psutil.process_iter()
等待列表进程结束
psutil.wait_procs(procs,timeout = none , callback = none)
2.4.2. 进程异常类
异常基类
class psutil.Error
无此进程
class psutil.NoSuchProcess(pid ,name = none ,msg = none )
僵尸进程
class psutil.ZombieProcess(pid ,name = none ,ppid =none , msg = none)
拒绝访问
class psutil.AccessDenied(pid = none , name = none ,msg = none)
超时时间已到
class psutil.TimeoutExpired(second , pid =none ,name = none ,msg = none)
2.4.3. 进程类Process
class psutil.Process(pid = none)
函数:(详情移步:psutil.processes)
- oneshot()
- pid
- ppid()
- name()
- exe()
- cmdline()
- environ()
- create_time()
- ad_dict(attrs = none ,ad_value = none)
- parent()
- status()
- cwd()
- username()
- uids()
- gids()
- terminal()
- nice(value = none)
- idnice(ioclass = none ,value = none)
- rlimit(resource , limits = none)
- io_counters()
- num_ctx_switches()
- num_fds()
- num_handles()
- num_threads()
- threads()
- cpu_times()
- cpu_percent(interval = none)
- cpu_affinity(cpus = none)
- memory_info()
- memory_ex()
- memory_full_info()
- memory_percent(memtype = 'rss')
- memory_maps(groups =Ture)
- children(recursive = False)
- open_files()
- connections(kind = 'inet')
- is_running()
- send_signal(signal)
- suspend()
- resume()
- terminate()
- kill()
- wait(timeout = none)
2.4.4. 进程开启类Popen
class psutil.Popen(*args , **kwargs)
用Popen打开两个应用进程:Foxmail.exe
和MockingBot.exe
,然后结束并杀掉这两个进程。
运行结果:
2.4. Windows系统下的 services
系统服务迭代器
psutil.win_service_iter()
根据名字获取服务
psutil.win_service_get(name)
Windows服务对象
class psutil.WindowsService
- name()
- display_name()
- binpath()
- username()
- start_type()
- pid()
- status()
- description()
- as_dict()
2.5. 常量
Constants
3. 小知识
3.1. python的传参
python传参的时候可以带上形式参数名,如本文中的例子:
psutil.cpu_times(False)
也可以写成:
psutil.cpu_times(percpu = False)
3.2. python的迭代器
假设现在拿到一个迭代器,it
如:it = psutil.win_service_iter()
单个获取迭代器中的元素:
it.next()
for循环获取元素:
for i in it:
print i
3.3. 僵尸进程
进程在调用exit命令结束自己生命的时候并没有真正被销毁,而是转为僵尸状态,称为一个僵尸进程
僵尸进程需要由他的父进程来收尸,如果父进程结束则转而由初始化进程来收尸。