当前位置: 首页 > news >正文

能下载的网站百度天眼查公司

能下载的网站,百度天眼查公司,网上做公司网站怎么做,网站开发成本如何账务处理文章目录 一、进程和线程的比较二、GIL全局解释器锁1.引入2.Python解释器的种类结论:在CPython解释其中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势。得出结论:GIL锁就是保证在同一时刻只…

文章目录

  • 一、进程和线程的比较
  • 二、GIL全局解释器锁
      • 1.引入
      • 2.Python解释器的种类
      • 结论:在CPython解释其中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势。
      • 得出结论:GIL锁就是保证在同一时刻只有一个线程执行,所有的线程必须拿到GIL锁才有执行权限
      • 以下几个问题需要理解记忆
      • 3.互斥锁
      • 4.线程队列(线程里使用队列)
          • 1.为什么线程中还有使用队列?
          • 2.线程队列:
      • 5.进程池和线程池的使用
      • 6.多线程爬取网页
      • 7.协程理论
      • 协程实现高并发

一、进程和线程的比较

1.进程的开销比线程开销大很多
2.进程之间的数据是隔离开的,但是,线程之间的数据不隔离
3.多个进程之间的线程数据不共享

二、GIL全局解释器锁

1.引入

首先要明白,GIL并不是Python的一个特性,其实在我们通常所称呼的Python解释器,其实是CPython解释器,因为大部分Python程序都是基于该解释器执行的,当然还有JPython解释器(基于Java编写的),而这个GIL则是CPython解释器的特性,而不是Python的特性。

GIL全程:Global Interpreter Lock,官方解释:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

2.Python解释器的种类

CPython

IPython

PyPy

JPython

IronPython

当前市场使用最多的解释器就是CPython解释器
GIL全局解释器锁是存在于CPython中

结论:在CPython解释其中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势。

比如:现在起一个线程,来回收垃圾数据,回收a=1这个变量,另外一个线程也要使用这个变量a,当垃圾回收线程还没没有把变量a回收完毕,另一个线程就来抢夺这个变量a使用。

怎么避免的这个问题,那就是在Python这门语言设计之处,就直接在解释器上添加了一把锁,这把锁就是为了让统一时刻只有一个线程在执行,言外之意就是哪个线程想执行,就必须先拿到这把锁(GIL), 只有等到这个线程把GIL锁释放掉,别的线程才能拿到,然后具备了执行权限.

得出结论:GIL锁就是保证在同一时刻只有一个线程执行,所有的线程必须拿到GIL锁才有执行权限

以下几个问题需要理解记忆

1.Python有GIL的原因,同一个进程下多个线程实际上同一时刻只有一个线程在执行

2.只有在Python上开进程用的多,其他语言一般不多开进程,只开多线程就够了

3.CPython解释器开多线程不能利用多核优势,只有开多进程才能利用多核优势,其他语言不存在这个问题

4.八核CPU电脑,要充分利用起这8个核,至少起8个线程,8条线程全是计算,计算机CPU使用率是100%

5.如果不存在GIL锁,一个进程下,开启8个线程,他就能够充分利用CPU资源,跑满CPU

6.CPython解释器中好多代码,模块都是基于GIL锁机制写起来的,改不了,我们不能用8核,只能用一个核,开启多进程,每个进程下开启的线程,可以被多个CPU调度执行

7.CPython解释器:io密集型使用多线程,计算密集型使用多进程

io密集型,遇到io操作会切换cpu,假设你开了8个线程,8个线程都有io操作—》io操作不消耗cpu—》一段时间内看上去,其实8个线程都执行了, 选多线程好一些

计算密集型,消耗cpu,如果开了8个线程,第一个线程会一直占着cpu,而不会调度到其他线程执行,其他7个线程根本没执行,所以我们开8个进程,每个进程有一个线程,8个进程下的线程会被8个cpu执行,从而效率高

计算密集型选多进程好一些,在其他语言中,都是选择多线程,而不选择多进程.

3.互斥锁

在多线程的情况下,同时执行一个数据,就会发生数据错乱问题

n = 10
from threading import Lock
import time
def task(lock):lock.acquire()global ntemp = ntime.sleep(0.5)n = temp - 1lock.release()"""拿时间换空间,空间换时间 时间复杂度"""
from threading import Threadif __name__ == '__main__':tt = []lock=Lock()for i in range(10):t = Thread(target=task, args=(lock, ))t.start()tt.append(t)for j in tt:j.join()print("主", n)

面试题:既然有了GIL锁,为什么还要互斥锁? (多线程下)
比如:我起了2个线程,来执行a=a+1,a一开始是0
1.第一个线程来了,拿到a=0,开始执行a=a+1,这个时候结果a就是1了
2.第一个线程得到的结果1还没有赋值回去给a,这个时候,第二个线程来了,拿到的a是0,继续执行
a=a+1结果还是1
3.加了互斥锁,就能够解决多线程下操作同一个数据,发生错乱的问题

4.线程队列(线程里使用队列)

1.为什么线程中还有使用队列?

同一个进程下多个线程数据是共享的
为什么先同一个进程下还会去使用队列呢
因为队列是:管道+锁
所以用队列还是为了保证数据的安全

2.线程队列:

1.先进后出
2.后进先出
3.优先级的队列

 from multiprocessing import Queue"""线程队列"""
import queue
queue.Queue()# queue.Queue 的缺点是它的实现涉及到多个锁和条件变量,因此可能会影响性能和内存效率。
import queueq=queue.Queue() # 无限大、
q.put('first')
q.put('second')
q.put('third')
q.put('third')
q.put('third')
q.put('third')
q.put('third')print(q.get())
print(q.get())
print(q.get())## 后进先出
import queue# Lifo:last in first out
q=queue.LifoQueue()
q.put('first')
q.put('second')
q.put('third')print(q.get())
print(q.get())
print(q.get())## 优先级队列
import queueq=queue.PriorityQueue()
#put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
q.put((20,'a'))
q.put((10,'b'))
q.put((30,'c'))print(q.get())
print(q.get())
print(q.get())
'''
结果(数字越小优先级越高,优先级高的优先出队):
(10, 'b')
(20, 'a')
(30, 'c')
'''

5.进程池和线程池的使用

池:池子、容器类型,可以盛放多个元素

进程池:提前定义好一个池子,然后,往这个池子里添加进程,以后只需要往这个进程池里面丢进任务就行,然后有了这个进程池里面的任意一个进程来执行任务

线程池:提前定义好一个池子,然后,往这个池子里面添加下城,以后,只需要往这个线程池里面添加任务就行,然后,有了这个线程池里面的任意一个线程来执行任务

进程池和线程池有什么好处呢?

def task(n, m):return n+mdef task1():return {'username':'kevin', 'password':123}
"""开进程池"""
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutordef callback(res):print(res) # Future at 0x1ed5a5e5610 state=finished returned int>print(res.result()) # 3def callback1(res):print(res) # Future at 0x1ed5a5e5610 state=finished returned int>print(res.result()) # {'username': 'kevin', 'password': 123}print(res.result().get('username'))
if __name__ == '__main__':pool=ProcessPoolExecutor(3) # 定义一个进程池,里面有3个进程## 2. 往池子里面丢任务pool.submit(task, m=1, n=2).add_done_callback(callback)pool.submit(task1).add_done_callback(callback1)pool.shutdown()  # join + closeprint(123)

6.多线程爬取网页

import requestsdef get_page(url):res=requests.get(url)name=url.rsplit('/')[-1]+'.html'return {'name':name,'text':res.content}def call_back(fut):print(fut.result()['name'])with open(fut.result()['name'],'wb') as f:f.write(fut.result()['text'])if __name__ == '__main__':pool=ThreadPoolExecutor(2)urls=['http://www.baidu.com','http://www.cnblogs.com','http://www.taobao.com']for url in urls:pool.submit(get_page,url).add_done_callback(call_back)

7.协程理论

进程资源分配
线程执行的最小单位
协程"""他是程序员自己意淫出来的,它不是在操作系统中实际存在的"""# 协程就是单线程下的并发
并发:切换+保存状态
# 以前的并发的切换其实是进程或者线程在切换既然是单线程下了,你说节省资源不
协程是最节省资源的,进程是最消耗资源的,其次是线程"""问题来了:怎么监测有没有遇到IO?"""
# 这里的切换是程序员级别的切换,我们自己切,不是操作系统切的
本上上就是最大限度的利用CPU资源
pip install geventimport gevent

协程实现高并发

服务端:
from gevent import monkey;monkey.patch_all()
import gevent
from socket import socket
# from multiprocessing import Process
from threading import Threaddef talk(conn):while True:try:data = conn.recv(1024)if len(data) == 0: breakprint(data)conn.send(data.upper())except Exception as e:print(e)conn.close()def server(ip, port):server = socket()server.bind((ip, port))server.listen(5)while True:conn, addr = server.accept()# t=Process(target=talk,args=(conn,))# t=Thread(target=talk,args=(conn,))# t.start()gevent.spawn(talk, conn)if __name__ == '__main__':g1 = gevent.spawn(server, '127.0.0.1', 8080)g1.join()客户端:import socket
from threading import current_thread, Threaddef socket_client():cli = socket.socket()cli.connect(('127.0.0.1', 8080))while True:ss = '%s say hello' % current_thread().getName()cli.send(ss.encode('utf-8'))data = cli.recv(1024)print(data)for i in range(5000):t = Thread(target=socket_client)t.start()
http://www.zhongyajixie.com/news/10768.html

相关文章:

  • 建站公司网站论坛优化大师的优化项目有哪7个
  • 做网站的技术支持武汉网站优化公司
  • 做网站做软件怎么赚钱吗万网官网首页
  • 在上海做钟点工的网站搜索引擎网站有哪些
  • 个人微信公众号怎么做微网站网络推广营销方案100例
  • 阿里云服务器多个网站百度app登录
  • 包头网站 建设重庆疫情最新消息
  • 腾讯云ADM怎么做网站中国seo关键词优化工具
  • 手机端网站制作教程交换友情链接时需要注意的事项
  • 论坛网站备案流程图深圳高端seo公司助力企业
  • https网站搭建武汉seo服务多少钱
  • 官方网站在哪里做app软件大概多少钱
  • 分类网站发布信息有生意做吗怎么在百度发布个人简介
  • 拓普网站建设新品怎么推广效果最好
  • 百度网站建设微信封面手机免费建站系统
  • asp.net 网站写好后如何运行百度小程序入口官网
  • 建设银行苏州官网招聘网站关键词如何快速排名
  • 怎样做付费下载的网站搜索引擎营销的概念
  • 审查元素 wordpress培训seo
  • 网站推广维护青岛seo培训
  • 个人网站怎么设计首页备案查询站长工具
  • 基督教网站做父母怎样教养孩子百度联盟广告收益
  • 建立一个网站大约要多少钱公司网页制作模板
  • 网站动图是怎么做的广州白云区今天的消息
  • 网站建设维护工作百度搜索风云榜小说总榜
  • 中国建设部网站官网怎么建立自己的网页
  • 毕节网站建设百度信息流推广教程
  • 品牌网站建设方国内十大4a广告公司
  • 做兼职的设计网站有哪些工作内容自己的网站怎么做seo
  • 网站首页做多大分辨率网络销售怎么找客户