1.第1种方式:threading模块
1)单线程执行
#-*- coding:utf-8 -*- import time def main(): print("我错了。。。") time.sleep(1) if __name__ == "__main__": start_time = time.time() for i in range(5): main() end_time = time.time() print("the run time is %s"%(end_time-start_time))
2)多线程执行
-
主线程会等待所有的子线程结束后才结束
#-*- coding:utf-8 -*- from threading import Thread import time #1.如果多个线程执行的都是同一个函数的话,各自之间不会有影响,各是各的 def main(): print("我错了。。。") time.sleep(1) if __name__ == "__main__": start_time = time.time() for i in range(5): # Process(target=test) Process进程完成多任务 t = Thread(target=main) t.start() end_time = time.time() print("the run time is %s"%(end_time-start_time))
2.线程和进程的区别联系
- 进程是资源分配的单位,资源,内存,屏幕,等
- 线程是cpu调度的单位
- 1个进程内有1个主线程,主线程可以创建多个子线程
- 主线程任务完成,要等待子线程的任务完成
3.第2种方式:Thread子类创建线程
#coding=utf-8 import threading import time class MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = "I'm "+self.name+' @ '+str(i) #name属性中保存的是当前线程的名字 print(msg) if __name__ == '__main__': t = MyThread() t.start()
4.僵尸进程,孤儿进程,0号1号进程
- 僵尸进程:子进程结束,父进程还没有给它收尸,此时的子进程成为僵尸进程
- 孤儿进程:父进程提前结束,没有等待子进程结束,此时的子进程成为孤儿进程
- 0号进程负责切换任务
- 1号进程负责生成,销毁 其他子进程
5.线程的执行顺序:无序
- 执行结果:(运行的结果可能不一样,但是大体是一致的)
#coding=utf-8 import threading import time class MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = "I'm "+self.name+' @ '+str(i) print(msg) def test(): for i in range(5): t = MyThread() t.start() if __name__ == '__main__':
- python解释器会屏蔽底层硬件的差异
6. 总结
- 每个线程一定会有一个名字,尽管上面的例子中没有指定线程对象的name,但是python会自动为线程指定一个名字。
- 当线程的run()方法结束时该线程完成。
- 无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。
- 线程的几种状态