一、线程和进程

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

二、python与多线程

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

  1. 多线程

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

  2.多线程处理返回结果

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

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

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

  3.守护线程

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

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

  4.线程锁

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

import threading
from threading import Lock
num = 0
lock = Lock() # 申请一把锁
def run():
global num
lock.acquire() # 加锁
num += 1
lock.release() # 解锁
lis = []
for i in range(5):
t = threading.Thread(target=run)
t.start()
lis.append(t)
for t in lis:
t.join()
print('over', num) #返回结果:over 5

  5.多进程

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

import multiprocessing,threading,time
def run2():
print('这是多线程启动的')
def run():
time.sleep(2)
print('多进程')
for i in range(5):#每个进程中启动5个线程
t=threading.Thread(target=run2)
t.start()
if __name__=='__main__':#启动进程必须放在这个里面
for i in range(5):
p=multiprocessing.Process(target=run)#启动5个进程
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. 《流畅的Python》 A Pythonic Object--第9章

    Python的数据模型data model, 用户可以创建自定义类型,并且运行起来像内建类型一样自然. 即不是靠继承,而是duck typing. 支持用内建函数来创建可选的对象表现形式.例如repr ...

  2. 前端知识体系:JavaScript基础-作用域和闭包-JavaScript的作用域和作用域链

    JavaScript的作用域和作用域链 作用域: 变量的作用域无非两种:全局作用域和局部作用域 全局作用域: 最外层函数定义的变量拥有全局作用域.即对任何内部函数来说都是可以访问的. <scri ...

  3. SQL分表

    一.为什么要水平分表?简而言之,当单表数据量过大时,无法对其进行有效的维护,以及查询速度严重变慢时,我们就需要对其时行水平分表. 二.什么时候需要水平分表?在数据库结构的设计中,需要充分考虑后期数据的 ...

  4. ZrOJ #882. 画画

    最后染成的图形一定一样的. 那么只用考虑两条路径在那些地方重合,重合的地方可以交换,这样答案就是2的重合次数次方.直接模拟就行了. qiang- CODE #include <bits/stdc ...

  5. contos7上安装rabbitmq

    #centeros7 安装erlang yum install erlang #启动扩展源 yum install epel-release #下载rabbitmq源文件 wget http://ww ...

  6. 彻底搞清楚setState

    setState最常见的问题是,是异步的还是同步的? setState在React.Component中的函数,是同步函数.但是我们调用的时候,不同的传参和不同的调用位置都会导致不同的结果. 从页面看 ...

  7. pyecharts v1 版本 学习笔记 柱状图

    柱状图 bar 基本演示例子 from pyecharts import options as opts from pyecharts.charts import Bar c =( Bar().add ...

  8. [Luogu] 线段树 2

    https://www.luogu.org/problemnew/show/P3373 双懒标记下放 先乘后加 #include <bits/stdc++.h> using namespa ...

  9. JXOJ 9.7 NOIP 放松模拟赛 总结

    比赛链接 T1 数数 题意:有a个红球,b个黄球,c个蓝球,d个绿球排成一列,求任意相邻不同色的排列的数目 ​ 1 <= a , b, c, d <= 30 答案对1e9 + 7 取膜 用 ...

  10. Java面向对象6(AA ~ AE)

    AE  简单的复数运算(类和对象) (SDUT 4303) import java.util.*; class Complex { int a, b; Complex() { } Complex(in ...