您的位置:首页 > 其它

多任务

2019-08-06 22:01 99 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Mr_Lee9/article/details/98664446

进程是资源分配的最小单位,线程是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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: