进程是资源分配的最小单位,线程是CPU调度的最小单位。
一、进程
创建一个进程
from multiprocessing import Process
import time
def sing():
for i in range(3):
print("我在唱歌第{}句歌词".format(i+1))
time.sleep(1)
def dance():
for i in range(3):
print("我在跳舞第{}段舞蹈".format(i+1))
time.sleep(1)
if __name__ == '__main__':
t1=Process(target=sing)
t2=Process(target=dance)
t1.start()
t2.start()
输出结果为:
进程之间的通讯:
from multiprocessing import Process,Queue
import time
def producer(q):
for i in range(3):
bz="包子:%d"%(i+1)
print("生产"+bz)
q.put(bz)
time.sleep(1)
def consumer(q):
for i in range(3):
bz=q.get()
print("消费"+bz)
if __name__ == '__main__':
q=Queue(3)
p1=Process(target=producer,args=(q,))
p2=Process(target=consumer,args=(q,))
p1.start()
p2.start()
输出结果为:
进程子类化:
from multiprocessing import Process,Queue
import time
class SubProcess(Process):
def __init__(self,x,name):
super().__init__()
self.x=x
self.name=name
def run(self):
for i in range(15):
bz = self.name+"包子:%d" % (i + 1)
print(bz)
self.x.put(bz)
time.sleep(1)
class SubProcess1(Process):
def __init__(self,x,name):
super().__init__()
self.x=x
self.name=name
def run(self):
for i in range(10):
bz = self.name+"吃"+self.x.get()
print(bz)
if __name__ == '__main__':
q=Queue(40)
zs=SubProcess(q,"张三")
ls=SubProcess(q,"李四")
ww=SubProcess1(q,"王五")
zl=SubProcess1(q,"赵六")
sq=SubProcess1(q,"孙七")
zs.start()
ls.start()
ls.join() # 堵塞主进程,直到子进程结束。
ww.start()
zl.start()
sq.start()
进程池
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 alter(name):
print(name,"下载完毕")
if __name__ == '__main__':
movies=['哪吒之魔童降世','速度与激情9','复仇者联盟5','变形金刚6']
p=Pool(3)
for movie in movies:
p.apply_async(downLoad,(movie,),callback=alter)
p.close()
p.join()
二、线程
使用threading模块创建线程
from threading import Thread
import time,os
def sing():
for i in range(10):
print("唱歌{}".format(i+1),os.getpid())
time.sleep(1)
def dance():
for i in range(10):
print("跳舞{}".format(i+1),os.getpid())
time.sleep(1)
if __name__ == '__main__':
t1=Thread(target=sing)
t2=Thread(target=dance)
t1.start()
t2.start()
传递参数
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=(7,))
t1.start()
join()方法
join()方法功能:当前线程执行完后其他线程才会继续执行。
setDaemon()方法
setDaemon()将当前线程设置为守护线程来守护主线程:
当主线程结束后,守护线程也就结束,不管是否执行完成。
注意:需要在子线程开启的时候设置为守护线程,否则无效。
threading模块提供的方法
threading.currentThread():返回当前的线程变量
threading.enumerate():返回一个包含正在运行的线程的列表。
threading.acticeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
使用继承方式开启线程。
import time
from threading import Thread
class Dance(Thread):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
for i in range(5):
print(self.name,"跳舞{}".format(i+1))
time.sleep(1)
class Sing(Thread):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
for i in range(5):
print(self.name,"唱歌{}".format(i+1))
time.sleep(1)
if __name__ == '__main__':
d=Dance("司扬眉")
s=Sing("董震")
d.start()
s.start()