一、线程和进程

  进程是拥有独立内存,能够独立运行的最小单位,也是程序执行的最小单位,线程是程序运行过程中,一个单一的顺序控制流程,是程序执行流的最小单位,一个进程至少包含一个线程,多线程共享进程的内存空间和上下文环境,线程上下文切换比进程上下文切换要快得多

二、python与多线程

  python中多线程涉及模块-----threading模块

  1. 多线程

  1. import threading,time,requests
  2. def downHtml(url,name):#下载网页
  3. content=requests.get(url).content#返回的是二进制的内容
  4. f=open(name+'.html','wb')#打开html文件
  5. f.write(content)#将下载网页的内容写到文件中
  6. f.close()#关闭文件
  7. urls=[#url列表
  8. ['aaa','http://www.aaa.cn'],
  9. ['bbb','http://www.bbb.cn'],
  10. ['ccc','http://www.ccc.cn'],
  11. ]
  12. start_time=time.time()#记录程序执行前时间
  13. threads=[]
  14. for url in urls:
  15. #实例化线程类,接收连个参数,一个是函数名,第二个是函数需要的参数,args代表接收多个参数,用逗号隔开,如果是一个参数时,也要写逗号,否则会当字符串处理
  16. t=threading.Thread(target=downHtml,args=(url[1],url[0]))
  17. #启动线程活动
  18. t.start()
  19. threads.append(t)
  20. #为什么时间统计完,程序还没有结束?因为线程是独立的,在运行py时,默认有个主线程, 主线程导入模块,读代码,执行代码-起了三个子线程后,主线程继续执行,执行完,就显示时长了,也就是这个时间只包括主线程的执行时间,不包含三个子线程执行程序的时间
  21. #解决办法,让主程序等待子程序都执行完再统计时间
  22. for t in threads:#循环等待3个子线程都执行完
  23. t.join()#主线程等待子线程结束,
  24. end_time = time.time()
  25. print(end_time-start_time)

  2.多线程处理返回结果

    启动多线程调用有返回值的函数时,返回值是获取不到的,

    解决办法,将返回值加到一个数组中

  1. import threading
  2. res=[]
  3. def sum(x,y):
  4. res.append(x+y)
  5. for i in range(5):
  6. t=threading.Thread(target=sum,args=(i,i))
  7. t.start()
  8. print(res)
  9. #返回结果[0,2,4,6,8]

  3.守护线程

  设置线程为Daemon后,也就是设置线程为守护线程后,主线程运行完,不管守护线程有没有执行完,立马销毁,也就是主线程需要等非守护线程执行结束才能结束,不需要等守护线程。如果想和主线程一起销毁就设置为守护线程,如果想让主线程等待这个线程执行完后销毁,则不要设置为守护线程

  1. import threading,time
  2. def pz():
  3.   print(‘’)
  4. time.sleep(2)
  5. print('守护线程')
  6. #threads=[]
  7. for i in range(50):
  8. t=threading.Thread(target=pz)
  9. #设置子线程为守护线程,主线程一旦结束,子线程立马结束,不管子线程有没有执行完成
  10. t.setDaemon(True)
  11. t.start()
  12. #threads.append(t)
  13. #如果主线程等待子进程,设置的守护进程就无效了
  14. #for i in threads:
  15. # t.join()
  16. print('done')
  17. #因为守护进程要等待2s,主进程只是打印done很快,所以最后输出只有done,主进程不等守护进程执行结束

  4.线程锁

  多线程在同时修改同一个全局变量时,可能会造成数据错误,为了避免这种错误,可以使用线程锁,python3可以不加,程序会自动加锁

  1. import threading
  2. from threading import Lock
  3. num = 0
  4. lock = Lock() # 申请一把锁
  5. def run():
  6. global num
  7. lock.acquire() # 加锁
  8. num += 1
  9. lock.release() # 解锁
  10. lis = []
  11. for i in range(5):
  12. t = threading.Thread(target=run)
  13. t.start()
  14. lis.append(t)
  15. for t in lis:
  16. t.join()
  17. print('over', num)
  18.  
  19. #返回结果:over 5

  5.多进程

  多线程不能利用多核cpu,多进程可以, 启动多进程使用multiprocessing模块

  1. import multiprocessing,threading,time
  2. def run2():
  3. print('这是多线程启动的')
  4. def run():
  5. time.sleep(2)
  6. print('多进程')
  7. for i in range(5):#每个进程中启动5个线程
  8. t=threading.Thread(target=run2)
  9. t.start()
  10. if __name__=='__main__':#启动进程必须放在这个里面
  11. for i in range(5):
  12. p=multiprocessing.Process(target=run)#启动5个进程
  13. p.start()

  

  

  

python进阶--多线程多进程的更多相关文章

  1. python进阶(二) 多进程+协程

    我们大多数的时候使用多线程,以及多进程,但是python中由于GIL全局解释器锁的原因,python的多线程并没有真的实现 实际上,python在执行多线程的时候,是通过GIL锁,进行上下文切换线程执 ...

  2. 『Python进阶』多进程多线程快速上手

    线程池快速上手 from concurrent.futures import ThreadPoolExecutor from utils import * workers = 8 with Threa ...

  3. 静听网+python爬虫+多线程+多进程+构建IP代理池

    目标网站:静听网 网站url:http://www.audio699.com/ 目标文件:所有在线听的音频文件 附:我有个喜好就是听有声书,然而很多软件都是付费才能听,免费在线网站虽然能听,但是禁ip ...

  4. python 爬虫 多线程 多进程

    一.程序.进程和线程的理解  程序:就相当于一个应用(app),例如电脑上打开的一个程序. 进程:程序运行资源(内存资源)分配的最小单位,一个程序可以有多个进程. 线程:cpu最小的调度单位,必须依赖 ...

  5. python进阶(一) 多进程并发机制

    python多进程并发机制: 这里使用了multprocessing.Pool进程池,来动态增加进程 #coding=utf-8 from multiprocessing import Pool im ...

  6. Python之多线程多进程

    (一)进程 1.定义 进程:就是一组资源的集合.一个程序就是一个进程. 线程是用来干活的,只有进程的话是没办法运行的,进程里其实是线程在具体干活的. import threading import t ...

  7. python进阶(15)多线程与多进程效率测试

    前言 在Python中,计算密集型任务适用于多进程,IO密集型任务适用于多线程   正常来讲,多线程要比多进程效率更高,因为进程间的切换需要的资源和开销更大,而线程相对更小,但是我们使用的Python ...

  8. Python的多线程(threading)与多进程(multiprocessing )

    进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...

  9. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

随机推荐

  1. javascript如何处理字符串中的\u

    问题: 字符串在页面显示的时候,有\u,如:Tesla\u8fc1\u79fb ,想要显示它的原文 let a = 'Tesla\u8fc1\u79fb' //显示 Tesla迁移 alert( un ...

  2. HDU 6150 - Vertex Cover | 2017 中国大学生程序设计竞赛 - 网络选拔赛

    思路来自 ICPCCamp /* HDU 6150 - Vertex Cover [ 构造 ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 题意: 给了你一个贪心法找最小覆盖的算法,构造一组 ...

  3. git commit 详解

    git commit 命令用来将本地暂存的修改提交到版本库. git commit -m '提交信息'. 我们用的比较多的应该就是-m 参数.添加提交信息. 经常手抖的同学可能会知道,git comm ...

  4. 添加QQ群

    点击右边添加     <a target=" src="//pub.idqqimg.com/wpa/images/group.png" alt="陆小果哥 ...

  5. 通过无线网络使用ADB ( Connect to android with ADB over TCP )

    之前用USB数据线连接电脑和android手机,用adb操控手机. 后来电脑前面板的USB全坏了,键盘.鼠标.USBKkey.打印机都需USB,  少一个USB口,只得对不常用设备进行插拔切换. 于是 ...

  6. Cogs 1345. [ZJOI2013] K大数查询(树套树)

    [ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...

  7. vue中.sync修饰符,实现子组件实时更新父组件的值

    vue 修饰符sync的功能是:当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定. 不过它有一个前身,先来看看.sync出现之前是如何实现的 父组件中(传递给子组件一个值:p ...

  8. vscode设置VUE eslint开发环境

    我的使用vscode开发VUE的常用设置 1.安装插件 ESLint Vetur Beautify Prettier - Code formatter Auto Rename Tag -重命名标签,闭 ...

  9. Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)

    logging模块 用于便捷记录日志且线程安全的模块(便捷的写文件的模块,不允许多个人同时操作文件) 1.单文件日志 import logging logging.basicConfig(filena ...

  10. Egyptian Collegiate Programming Contest (ECPC 2015)

    题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找 ...