代码环境:python3.6
1,程序:
一堆代码以文本形式存入一个文档
2,进程:
程序运行的一个状态
包含地址空间,内存,数据线每个进程有自己独立的运行环境,多进程共享数据
3,线程:
一个进程的独立运行的片段,一个进程可以由多个线程
轻量化的进程一个进程的多个线程间共享数据和上下文运行环境
共享互斥
4,全局解释器
py代码的执行是由py虚拟机进行控制的在主循环中只能有一个控制线程在执行
5,py包
threadthreading
6,正常的python执行顺序的代码
import time
def loop1():
print('start 1 at:',time.ctime())
time.sleep(4)
print('end 1 at:', time.ctime())
def loop2():
print('start 2 at:',time.ctime())
time.sleep(2)
print('end 2 at:', time.ctime())
def main():
print('start 3 at:', time.ctime())
loop1()
loop2()
print('end 3 at:', time.ctime())
if __name__ == '__main__':
main()
运行结果是这样的:先执行主函数打印start,然后执行loop1函数的start,运行loop1的函数体sleep4秒,接着打印end 1的时间,loop2是在loop运行结束之后开始执行的,过程和loop1一样,这是普通的python执行顺序,最后到主函数的end输出。
start 3 at: Tue Jun 19 21:29:52 2018
start 1 at: Tue Jun 19 21:29:52 2018
end 1 at: Tue Jun 19 21:29:56 2018
start 2 at: Tue Jun 19 21:29:56 2018
end 2 at: Tue Jun 19 21:29:58 2018
end 3 at: Tue Jun 19 21:29:58 2018
7,多线程的简单例子
使用python3的_thread包,loop1和loop2是2个函数,由主函数开2个线程去调用这两个函数
import time
import _thread as thread
def loop1():
print('start 1 at:',time.ctime())
time.sleep(4)
print('end 1 at:', time.ctime())
def loop2():
print('start 2 at:',time.ctime())
time.sleep(2)
print('end 2 at:', time.ctime())
def main():
# print('start 3 at:', time.ctime())
# loop1()
# loop2()
# print('end 3 at:', time.ctime())
print('start main at:', time.ctime())
thread.start_new_thread(loop1,())
thread.start_new_thread(loop2,())
print('end main at:', time.ctime())
if __name__ == '__main__':
main()
while 1:
time.sleep(1)
运行结果如下:我们可以看到start1和start2是同时开始执行的。这就是多线程
start main at: Tue Jun 19 21:52:56 2018
end main at: Tue Jun 19 21:52:56 2018
start 1 at: Tue Jun 19 21:52:56 2018
start 2 at: Tue Jun 19 21:52:56 2018
end 2 at: Tue Jun 19 21:52:58 2018
end 1 at: Tue Jun 19 21:53:00 2018
8,使用threading包改写上面的案例
因为_thread已经过时了,一些功能不好用了。示例演示可以设置线程的同时传递参数。
# -*- coding: utf-8 -*-
import time
import threading
def loop1(in1):
print('start 1 at:',time.ctime())
print('param 1:',in1)
time.sleep(4)
print('end 1 at:', time.ctime())
def loop2(in1,in2):
print('start 2 at:',time.ctime())
print('param 2:',in1,in2)
time.sleep(2)
print('end 2 at:', time.ctime())
def main():
print('start main at:', time.ctime())
#如果只有一个参数,就一定要给个','
t1 = threading.Thread(target=loop1,args=(1,))
t1.start()
# t1.join()
t2 = threading.Thread(target=loop2, args=(2,3))
t2.start()
t1.join()
t2.join()
print('end main at:', time.ctime())
if __name__ == '__main__':
main()
执行结果是这样的:
start main at: Tue Jun 19 23:22:25 2018
start 1 at: Tue Jun 19 23:22:25 2018
param 1: 1
start 2 at: Tue Jun 19 23:22:25 2018
param 2: 2 3
end 2 at: Tue Jun 19 23:22:27 2018
end 1 at: Tue Jun 19 23:22:29 2018
end main at: Tue Jun 19 23:22:29 2018
9,设置守护进程
- 如果在线程中将子线程设置成守护线程,则子线程会在主线程结束后自动退出
- 守护线程不允许离开主线程独立运行
- 守护进程能否实现和环境有关
示例代码是这样的
import time
import threading
def fun():
print('start fun')
time.sleep(2)
print('end fun')#子进程在执行完上一句就被kill掉了,所以这句不执行了
print('start main')
t = threading.Thread(target=fun,args=())
t.setDaemon(True)#需要在启动前将他设置成守护
t.start()
time.sleep(2)
print('end main')
执行结果:因为把子进程设为了主进程的守护进程,所以当主进程休息2秒结束之后,和子进程一起结束了,所以子进程后面的print语句就不执行了
start main
start fun
end main
10,进程的一些常用属性
currentThread:当前的线程 enumerate: activeCount:当前正在执行的线程数量 setname:设置线程名 getname:获取当前线程名字
示例代码:
import time
import threading
def loop1():
print('start 1 at:',time.ctime())
time.sleep(1)
print('end 1 at:', time.ctime())
def loop2():
print('start 2 at:',time.ctime())
time.sleep(3)
print('end 2 at:', time.ctime())
def loop3():
print('start 3 at:',time.ctime())
time.sleep(4)
print('end 3 at:', time.ctime())
def main():
print('start main at:', time.ctime())
t1 = threading.Thread(target=loop1,args=())
t1.setName('THR 1')
t1.start()
t2 = threading.Thread(target=loop2,args=())
t2.setName('THR 2')
t2.start()
t3 = threading.Thread(target=loop3,args=())
t3.setName('THR 3')
t3.start()
t1.join()
t2.join()
t3.join()
time.sleep(3)
for thr in threading.enumerate():
print('running thread is {0}'.format(thr.getName()))
print('the count of running threads is {0}'.format(threading.activeCount()))
print('end main at:', time.ctime())
if __name__ == '__main__':
main()
结果如下:
start main at: Tue Jun 19 23:34:28 2018
start 1 at: Tue Jun 19 23:34:28 2018
start 2 at: Tue Jun 19 23:34:28 2018
start 3 at: Tue Jun 19 23:34:28 2018
end 1 at: Tue Jun 19 23:34:29 2018
end 2 at: Tue Jun 19 23:34:31 2018
end 3 at: Tue Jun 19 23:34:32 2018
running thread is MainThread
the count of running threads is 1
end main at: Tue Jun 19 23:34:35 2018