多任务
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()
相关文章推荐
- 在Linux中三种让crontab每秒执行任务的方法
- Spring整合TimerTask实现定时任务调度
- java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫
- 线程并发处理跑批任务
- linux下定时任务
- mysql计划任务实例(event)
- 七周任务一:显示时分秒
- 2016蓝桥杯假期任务之《黑洞数》
- springboot之后,使用@schedule注解,开启定时任务
- Android IntentService 可执行耗时任务的Service
- play framework 2.6 定时任务,异步调度任务的简单使用
- 定时任务调度(mongoDB)
- c++11 线程:让你的多线程任务更轻松
- SQL Server 2008数据挖掘查询任务
- 第7周实验报告任务一
- Benchmark库的建立04:单个任务的长时间执行Bug
- 【C#】【Thread】Barrier任务并行
- dispatch_group的实际使用案例,监听多任务
- shadowX 分布式任务调度框架实现企业级监控业务