多线程,适用于IO密集型任务

IO,input,output缩写,包括网路io(比如上传下载),磁盘io,(比如数据库读写),CPU操作不频繁

多进程,适用于CPU密集型任务

数据分析,算法,依赖CPU来运算

进程就是多个资源的集合,

线程是包含在进程里面的,线程和线程直接是相对独立的

线程的优点

1.易于调度。

2.提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

3.开销少。创建线程比创建进程要快,所需开销很少。

4.利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
def down_load():
time.sleep(5)
print('运行完了')
# threading.Thread(target=down_load,args=('name','id')#target是函数名,args是函数的参数没有可以不写
t1 = threading.Thread(target=down_load)
t1.start()#启动线程

每个子线程都是在主线程里启动的子线程

======================================================================================

继承调用

class Test_thread(threading.Thread):#继承threading的Thread类
def __init__(self,num):
threading.Thread.__init__(self)#执行父类的构造方法
self.num = num
def run(self):#运行多线程的函数
while self.num>0:
print(threading.active_count())#打印当前线程数量
self.num-=1
for i in range(5):
t = Test_thread(2)#生成实例
t.start()#启动线程

Python不是真正意义的多线程,Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。CPU有几个核心就能够同时执行几个任务,Python无法利用多核就是因为它有全局解释器锁(GIL)

==================================================================================================

线程池,线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数

下面是一个下载图片的线程池例子:

import threadpool,requests
from hashlib import md5
url_list = ['http://www.nnzhp.cn/wp-content/uploads/2019/10/f410afea8b23fa401505a1449a41a133.png',
'http://www.nnzhp.cn/wp-content/uploads/2019/11/481b5135e75c764b32b224c5650a8df5.png',
'http://www.nnzhp.cn/wp-content/uploads/2019/11/b23755cdea210cfec903333c5cce6895.png',
'http://www.nnzhp.cn/wp-content/uploads/2019/11/542824dde1dbd29ec61ad5ea867ef245.png'] def down_load(url):#下载图片的函数
r = requests.get(url)
m = md5(url.encode())
with open(m.hexdigest()+'.png','wb')as fw:
fw.write(r.content) pool = threadpool.ThreadPool(10)#实例化一个线程池 threadpool实例化一个对象pool,调用了构造函数参数是10
reqs = threadpool.makeRequests(down_load,url_list)#分配数据 for req in reqs:
pool.putRequest(req) #将线程放入线程池 # [pool.putRequest(req) for req in reqs]#列表生成试
pool.wait()#等待线程池结束
print('end')#运行主线程

=====================================================================================================================

守护线程,主线程结束,守护线程马上死掉

import threading
import time
class Fun():
def sum(self,a,b):
time.sleep(2)
print(a+b)
def cut(self,c,d):
time.sleep(5)
print(c-d)
T = Fun()
t1 = threading.Thread(target=T.sum,args=(1,2))
t2 = threading.Thread(target=T.cut,args=(5,4))
t1.setDaemon(True)#设置线程为守护线程
t2.setDaemon(True)#设置线程为守护线程
t1.start()
t2.start()
print('主线程运行完毕') 结果只会打印出'主线程运行完毕'

===================================================================================================================

线程锁,多个线程操作同一个数据的时候 加锁

num = 0
lock = threading.Lock()#申请一把锁 def add():
global num
with lock:#加锁,解锁
num+=1 for i in range(20):
t = threading.Thread(target=add)
t.start() print(num)

===================================================================================================================

多进程


import multiprocessing,time
def down_load():
time.sleep(5)
print('运行完了') if __name__ == '__main__':#windows系统要加,不然会报错 for i in range(5):
p = multiprocessing.Process(target=down_load)#分配5个进程运行函数
p.start()#启动进程
p.join()#等待子进程。子线程互相等待 while len(multiprocessing.active_children())!=0:#等待子进程执行完在执行主进程
pass print(multiprocessing.active_children())#查看有多少个子进程 print(multiprocessing.current_process())#主进程
 
 

python_多线程多进程的更多相关文章

  1. C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)

     说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...

  2. Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

    最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效 ...

  3. WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)

    原文 WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口) WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程 ...

  4. Python多线程多进程那些事儿看这篇就够了~~

    自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...

  5. python GIL全局解释器锁,多线程多进程效率比较,进程池,协程,TCP服务端实现协程

    GIL全局解释器锁 ''' python解释器: - Cpython C语言 - Jpython java ... 1.GIL: 全局解释器锁 - 翻译: 在同一个进程下开启的多线程,同一时刻只能有一 ...

  6. python实现并发服务器实现方式(多线程/多进程/select/epoll)

    python实现并发服务器实现方式(多线程/多进程/select/epoll)   并发服务器开发 并发服务器开发,使得一个服务器可以近乎同一时刻为多个客户端提供服务.实现并发的方式有多种,下面以多进 ...

  7. 多线程&多进程解析:Python、os、sys、Queue、multiprocessing、threading

    当涉及到操作系统的时候,免不了要使用os模块,有时还要用到sys模块. 设计到并行程序,一般开单独的进程,而不是线程,原因是python解释器的全局解释器锁GIL(global interpreter ...

  8. GDB 调试多线程多进程

    GDB是linux下的调试利器,在c/c++程序开发过程中必不可少的.这里总结一下多进程和多线程的调试方法和技巧. 多进程的调试: 如下示例 #include <sys/mman.h> # ...

  9. 多线程/多进程/异步IO

    SOCK_STREAM :TCPSOCK_Dgram :UDP family=AF_INET: 服务器之间的通信AF_INET6: 服务器之间的通信AF_UNIX: Unix不同进程间的通信 永远遵循 ...

随机推荐

  1. IIS调试

    点击调试程序的时候默认启动TFS内置的调试服务器http://localhost:51607/,在该处填写自己在IIS上配置的站点就能进入自己的站点调试http://mr.ciwong.com

  2. Android selector一些坑

    最近给textview添加seletor时,发现textcolor和background要分开成两个selector.并且,textcolor的要再res路径下建color路径,然后在color下面建 ...

  3. Python学习教程:Pandas中第二好用的函数

    从网上看到一篇好的文章是关于如何学习python数据分析的迫不及待想要分享给大家,大家也可以点链接看原博客.希望对大家的学习有帮助. 本次的Python学习教程是关于Python数据分析实战基础相关内 ...

  4. [ZJOI2007]捉迷藏(动态点分治/(括号序列)(线段树))

    题目描述 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条 ...

  5. PTA(Advanced Level)1036.Boys vs Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  6. 什么是云数据库RDS PPAS 版

    云数据库PPAS版,是阿里云与EnterpriseDB公司合作基于PostgreSQL高度兼容Oracle语法的数据库服务,为用户提供易于操作的迁移工具,兼容范围涵盖:PL/SQL.数据类型.高级函数 ...

  7. Java中this与super的区别

    this与super关键字在java中构造函数中的应用: ** super()函数 ** super()函数在子类构造函数中调用父类的构造函数时使用,而且必须要在构造函数的第一行,例如: class ...

  8. Python_3day

    循环 循环是一种控制语句块重复执行的结构 while 适用于广度遍历 for 开发中经常使用   while 循环 当一个条件保持真的时候while循环重复执行语句 while 循环一定要有结束条件, ...

  9. IDEA导入Eclipse 非Maven的Web项目

  10. GitFlow入门

    1-概述 2-GitFLow分支介绍 2.1-master 分支 2.2-develop 分支 2.3-feature 分支 2.4-release 分支 2.5-hotfix 分支 3-GitFlo ...