进程
- (一)什么是进程
-
当程序运行起来他就是一个进程。通俗的理解就是不运行的时候是程序,运行起来就是进程。程序和进程的对应关系是:程序只有一个,但是进程可以有多个。
-
-
(二)创建多进程
-
from multiprocessing import Process # import time # def sing(): # for i in range(10): # print("我在唱第{}句歌词".format(i+1)) # time.sleep(1) # def dance(): # for i in range(10): # print("我在跳第{}段舞蹈".format(i+1)) # time.sleep(1) # if __name__ ==' __main__': # t1=Process(target=sing) # t2=Process(target=dance) # t1.start() # t2.start() # sing() # dance()
-
(三)进程的状态
-
from multiprocessing import Process#$ import os def sing(num): print('参数是', num, '进程的ID', os.getpid(), '父进程', os.getppid()) def dance(num): print('参数是', num, '进程的ID', os.getpid(), '父进程', os.getppid()) if __name__ == '__main__': print('主进程ID', os.getpid()) p1 = Process(target=sing, args=(9,)) p2 = Process(target=dance, args=(99,)) p1.start() p2.start()
-
-
from multiprocessing import Queue#$ # # q=Queue(3) # q.put(10) # q.put(20) # q.put(30) # try: # q.put(40,block=False)# 堵塞了就报错 # except: # print("队满了,回键") # print("到这了")
-
-
(四)进程之间通讯
-
(五)进程池
-
# from multiprocessing import Pool# # import time # def downLoad(movie): # for i in range(5): # print(movie, '下载进度%.2f%%' % ((i + 1) / 5 * 100)) # time.sleep(1) # return movie # def alert(name): # print(name,"下载完毕,请收看") # if __name__ == '__main__': # movies=['喜剧','闹剧','肥皂剧','联欢剧','连续剧'] # p=Pool(3) # for movie in movies: # p.apply_async(downLoad,args=(movie,),callback=alert) # p.close() # p.join()
线程
-
(一)线程概念
- 由于进程是资源拥有者,创建、撤消与切换存在较大的内存开销,因此需要引入轻型进程即线程,进程是资源分配的最小单位,线程是 CPU 调度的最小单位(程序真正执行的时候调用的是线程).每一个进程中至少有一个线程
-
(二)进程和线程之间的关系
-
对比参考
- (三)使用 threading 模块创建线程
- 0
# from threading import Thread#¥ # import time # import os # def sing(): # for i in range(10): # print("唱歌%d"%(i+1),os.getpid()) # time.sleep(1) # def dance(): # for i in range(10): # print("跳舞%d"%(i+1),os.getpid()) # time.sleep(1) # if __name__ == '__main__': # t1=Thread(target=sing) # t2=Thread(target=dance) # t1.start() # t2.start()
- 1、传递参数
# from threading import Thread # import time # # def sing(): # for i in range(10): # print("唱歌%d"%(i+1)) # time.sleep(0.5) # def dance(): # for i in range(10): # print("跳舞%d"%(i+1)) # time.sleep(1) # # if __name__ == '__main__': # t1 = Thread(target=sing) # t2 = Thread(target=dance) # t1.start() # t2.start() # # t1.join() # t2.join() # # print("结束")
- 2、join()方法
# from threading import Thread # import time # # def sing(): # for i in range(10): # print("唱歌%d"%(i+1)) # time.sleep(0.5) # def dance(): # for i in range(10): # print("跳舞%d"%(i+1)) # time.sleep(1) # # if __name__ == '__main__': # t1 = Thread(target=sing) # t2 = Thread(target=dance) # t1.start() # t2.start() # # t1.join() # t2.join() # # print("结束")
- 3setDaemon() 方法
# from threading import Thread # import time # def get(num): # for i in range(num): # print(i) # time.sleep(1) # if __name__ == '__main__': # t1=Thread(target=get,args=(5,)) # t1.setDaemon(True)#守护线程 # t1.start() # print("主线程结束了")
- 4实例方法
- 5、threading 模块提供的方法
- 在python中实现多任务有三种方式,进程,线程,协程。
- 进程子类化
from multiprocessing import Process#$ # import os,time # class SubProcess(Process):#进程子类化 # def __init__(self,x): # super().__init__() # self.x=x # def run(self): # for i in range(self.x): # print("启动进程",i,os.getpid()) # time.sleep(1) # if __name__ == '__main__': # # p=SubProcess(3) # p.start() # p1=SubProcess(3) # p1.start()
-
(四)使用继承方式开启线程
-
定义一个类继承 threading.Thread 类。
- 复写父类的 run()方法
-
(五)线程之间共享全局变量
-
(六)共享全局变量的问题