跟我一起从零开始学python(八)全栈开发

news2024/11/27 2:47:13

前言

回顾之前讲了python语法编程 ,必修入门基础和网络编程,多线程/多进程/协程等方面的内容,后续讲到了数据库编程篇MySQL,Redis,MongoDB篇,和机器学习前面没看的也不用往前翻,系列文已经整理好了:

1.跟我一起从零开始学python(一)编程语法必修
2.跟我一起从零开始学python(二)网络编程
3.跟我一起从零开始学python(三)多线程/多进程/协程
4.跟我一起从零开始学python(四)数据库编程:MySQL数据库
5.跟我一起从零开始学python(五)数据库编程:Redis数据库
6.跟我一起从零开始学python(六)数据库编程:MongoDB数据库
7.跟我一起从零开始学python(七)机器学习

本系列文根据以下学习路线展开讲述,由于内容较多,:

从零开始学python到高级进阶路线图

关注公众号:python技术训练营,学习进阶一步到位

适用于零基础学习和进阶人群的python资源:

① 腾讯认证python完整项目实战教程笔记PDF
② 十几个大厂python面试专题PDF
③ python全套视频教程(零基础-高级进阶JS逆向)
④ 百个项目实战+源码+笔记
⑤ 编程语法-机器学习-全栈开发-数据分析-爬虫-APP逆向等全套项目+文档
⑥ 交流学习
⑦ 想要兼职接单

一丶web网页开发

一丶HTML5

HTML5是Hyper Text Markup Language(超文本标记语言)的第5个版本,它是用于创建网页和Web应用程序的标准。与以前的HTML版本相比,HTML5增加了一些新的功能和API,它是为了适应现代互联网的需求,特别是移动设备和嵌入式设备的需求。

HTML5 的主要特征包括:

1.语义化标签:HTML5 引入了一些新的标签,如header、nav、section、article等等,这些标签使网页内容更具有语义意义,提高了可读性和可访问性。

2.多媒体支持:HTML5允许在网页中直接嵌入音频和视频,而不需要插件,这大大简化了Web应用程序的开发。此外,HTML5 还支持以自适应方式调整视频大小,以适应不同的设备。

3.Canvas 绘图功能:HTML5引入了一个新的API,称为Canvas,它可以在网页上绘制图形、图表、动画等。Canvas API为Web应用程序提供了更多的交互和可视化效果。

4.本地存储:HTML5引入了两个本地存储 API:localStorage 和 sessionStorage。这些API允许Web应用程序在本地存储数据,从而提高了应用程序的性能和可靠性。

5.Web Worker:HTML5引入了一个新的API,称为Web Workers,它允许JavaScript在后台运行,而不会阻塞用户界面。这可以提高Web应用程序的性能和响应速度。

6.增强的表单功能:HTML5引入了一些新的表单元素和属性,如 date、time、email、url、number、range 等,这些元素可以极大地改善网站的用户交互体验,减少了对JavaScript的依赖。

7.WebSocket:HTML5 引入了一种新的网络协议,称为WebSocket,它可以在现代Web浏览器中打开持久连接,实时传输数据。这使得Web应用程序能够快速、可靠地实现服务器与客户端之间的双向通信。

8.GeoLocation:HTML5 引入了一个新的API,称为GeoLocation,它允许Web应用程序获取用户的地理位置。这为许多类型的Web应用程序提供了无限的可能性,如地图和定位应用程序。

总之,HTML5是一个重要的Web技术标准,它提供了许多新的功能和API,可以大大扩展现代Web应用程序的功能和性能。如果你要学习Web开发,那么HTML5是一个值得学习的重要技术。

二丶CSS

CSS,即层叠样式表,是一种用于描述网页外观和布局的语言。在web开发中,CSS通常与HTML结合使用,来控制网页的样式。

下面是CSS的一些详解:

1.CSS语法

CSS使用选择器和属性来描述网页的样式。选择器用于选择要更改样式的HTML元素,而属性用于描述要更改的样式。CSS的语法如下:

选择器 {
属性1: 值1;
属性2: 值2;
…
}

选择器通常使用HTML元素的标签名、类名或ID来指定要更改样式的元素。例如,以下是一个CSS规则,它将所有h1元素的字体颜色设置为红色:

h1 {
color: red;
}

2.CSS规则

CSS规则由选择器和一组属性声明组成。每个属性声明由属性名称和属性值组成。例如,以下是一个CSS规则,它将所有class为"button"的按钮的字体颜色设置为白色,背景颜色设置为蓝色:

.button {
color: white;
background-color: blue;
}

3.CSS单位

CSS支持各种单位来表示尺寸、距离和时间。以下是一些常见的CSS单位:

  • px: 像素
  • em: 相对于父元素的字体大小
  • rem: 相对于根元素的字体大小
  • %: 相对于父元素的尺寸
  • vh/vw: 视口高度/宽度的百分比

4.CSS盒模型

CSS盒模型用于描述HTML元素的尺寸和定位。每个HTML元素都是一个“盒子”,它由四个部分组成:内容区域、内边距区域、边框区域和外边距区域。以下是CSS盒模型的示意图:

+-----------------------+
|         外边距        |
|      +-------------+  |
|      |   边框      |  |
|      |  +---------+|  |
|      |  |内边距   ||  |
|      |  |         ||  |
|      |  |         ||  |
|      |  |         ||  |
|      |  +---------+|  |
|      +-------------+  |
|         内容          |
+-----------------------+

5.CSS布局

CSS可以用于控制网页的布局,包括如何定位和排列HTML元素。以下是一些常见的CSS布局技术:

  • position属性:可以将元素定位为相对于其父元素、文档顶部或文档底部。
  • float属性:可以使元素浮动在文本周围,从而创建多列布局。
  • display属性:可以更改元素的显示方式,例如将元素转换为表格或弹性框布局。
  • flexbox布局:提供了一种灵活的方式来排列和对齐HTML元素,特别适用于创建响应式布局。

三丶JavaScript

JavaScript是一种用于编写交互式web页面的脚本语言。使用JavaScript,开发者可以通过利用web浏览器所提供的API来交互式地修改HTML和CSS,响应用户输入、处理数据等。

下面是一些JavaScript的详解:

1.JavaScript语法

JavaScript的基本语法与其他编程语言类似,包括变量、运算符、循环、条件语句、函数等。JavaScript代码可以在网页中内嵌,也可以从外部文件中调用。以下是一个简单的JavaScript代码示例,它会将两个数字相加并将结果输出到网页上:

<script> var a = 1; var b = 2; var c = a + b; document.write(c); </script>

2.JavaScript变量

JavaScript变量用于保存数据,可以是数字、字符串、布尔值、数组、对象等数据类型。变量必须先声明后使用。声明变量可以使用关键字var、let或const,具体使用哪种方式取决于变量的作用域和可变性。以下是一个使用var声明变量的示例:

var name = “John”;
var age = 30;
var isStudent = true;

3.JavaScript算术操作符

JavaScript支持各种算术操作符,包括加、减、乘、除、取模(余数)等。以下是一个使用算术操作符的示例:

var a = 10;
var b = 5;
var c = a + b; // 15
var d = a - b; // 5
var e = a * b; // 50
var f = a / b; // 2
var g = a % b; // 0

4.JavaScript函数

JavaScript函数是一段可重复使用的代码块,它接受输入(参数)、执行一些操作,并返回一些结果。定义JavaScript函数可以使用function关键字。以下是一个简单的JavaScript函数示例,它接受两个数字作为参数,并返回它们的和:

function add(a, b) {
return a + b;
}

5.JavaScript事件

JavaScript事件是指浏览器内发生的交互性行为或状态,例如点击按钮、滚动页面等。通过在JavaScript代码中编写事件处理程序,可以在事件发生时执行特定的操作。以下是一个简单的JavaScript事件处理程序示例,它在用户单击按钮时显示一条消息:

Click me!

6.JavaScript对象

JavaScript对象是一组相关属性和方法的集合。属性是对象的特征,方法是对象的行为。JavaScript对象可以通过对象字面量、构造函数或类来定义。以下是一个使用对象字面量定义JavaScript对象的示例:

var person = {
firstName: “John”,
lastName: “Doe”,
age: 30,
fullName: function() {
return this.firstName + " " + this.lastName;
}
};

7.JavaScript异步编程

JavaScript异步编程是一种特殊的编程模型,它允许JavaScript代码在等待某些操作完成时不被阻塞。常见的异步编程模式包括回调函数、Promise和async/await。以下是一个使用回调函数进行异步编程的示例,它使用XMLHttpRequest对象从服务器获取数据,并在数据就绪时调用回调函数:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// 数据就绪,执行成功回调
var data = JSON.parse(this.responseText);
handleData(data);
}
};
xhttp.open(“GET”, “https://example.com/api/data”, true);
xhttp.send();

四丶jQuery

jQuery是一种流行的JavaScript库,它简化了JavaScript编程,提供了一个方便的操作HTML文档和处理事件的API。

下面是一些jQuery的详解:

1.jQuery语法

jQuery通过选择器操作HTML元素,提供了方便快捷的操作文档对象模型(DOM)的语法。

$()函数可以接收一个选择器字符串或HTML文档对象,并返回一个jQuery对象,该对象提供了许多jQuery功能。以下是一个基本的jQuery示例:

$(document).ready(function(){
// 在文档准备好后,执行这里面的代码
});

2.jQuery选择器

jQuery选择器支持与CSS选择器相同的语法,可以使用tag名称、class和ID等选择元素。以下是一些常用的jQuery选择器示例:

// 选择所有元素
$(document).find(‘*’)

// 选择ID为my-element的元素
$(‘#my-element’)

// 选择class为my-class的元素
$(‘.my-class’)

// 选择所有button元素
$(‘button’)

3.jQuery操作HTML元素

通过jQuery对象,可以方便地对HTML元素进行操作。以下是一些常用的jQuery操作HTML元素的示例:

// 获取元素的文本内容
var text = $(‘p’).text();

// 设置元素的文本内容
$(‘p’).text(‘new text’);

// 获取元素的属性值
var href = $(‘a’).attr(‘href’);

// 设置元素的属性值
$(‘a’).attr(‘href’, ‘new href’);

// 显示元素
$(‘div’).show();

// 隐藏元素
$(‘div’).hide();

4.jQuery处理事件

jQuery可以帮助简化处理事件的过程,例如鼠标单击、鼠标移动、键盘按键等。以下是一些常用的jQuery处理事件的示例:

// 在元素上绑定单击事件
$(‘button’).click(function(){
// 执行单击事件的代码
});

// 在文档上绑定键盘按键事件
$(document).keypress(function(event){
// 执行键盘按键事件的代码
});

// 在元素上绑定鼠标移动事件
$(‘p’).mousemove(function(event){
// 执行鼠标移动事件的代码
});

5.jQuery效果

jQuery提供了一系列效果函数,可以通过动画和渐变等方式来操作HTML元素。以下是一些常用的jQuery效果示例:

// 使用渐隐效果隐藏元素
$(‘p’).fadeOut();

// 使用渐显效果显示元素
$(‘p’).fadeIn();

// 使用动画函数移动元素
$(‘div’).animate({
left: ‘250px’,
top: ‘250px’
});

// 在元素上绑定滚动事件
$(window).scroll(function(){
// 执行滚动事件的代码
});

五丶Vue详解

Vue是一种流行的JavaScript框架,用于构建交互式的单页面Web应用程序。它的主要特点是轻量、高效和易学。Vue提供了许多功能,例如响应式数据绑定、组件系统、路由和状态管理等。

以下是一些Vue的详解:

1.Vue组件

Vue组件是Vue应用程序的核心概念,该概念允许您将用户界面拆分为独立的、可重用的部分。每个Vue组件都有自己的模板、脚本和样式。

以下是一个简单的Vue组件示例:

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ description }}</p>
  </div>
</template>

<script>
export default {
  name: 'MyComponent',
  props: {
    title: String,
    description: String
  }
}
</script>

<style>
h1 { font-size: 24px }
p { font-size: 16px }
</style>

2.Vue响应式数据绑定

Vue使用它的响应式系统来自动跟踪应用程序状态的变化,并将这些变化反映到视图中。当应用程序状态发生变化时,所有使用这些状态的Vue组件都将以最新的值重新渲染。

以下是一个简单的Vue响应式数据绑定示例:

<template>
  <div>
    <p>Counter: {{ counter }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      counter: 0
    }
  },
  methods: {
    increment() {
      this.counter++
    }
  }
}
</script>

3.Vue路由

Vue Router是一个Vue.js官方的路由插件,用于在Vue应用程序中实现路由功能,例如在不同页面之间切换、向后和向前历史记录等。

以下是一个简单的Vue路由示例:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from './views/Home.vue'
import About from './views/About.vue'

Vue.use(VueRouter)

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
]

const router = new VueRouter({
  mode: 'history',
  routes
})

export default router

4.Vue状态管理

Vuex是一个状态管理库,用于在Vue应用程序中管理应用程序的状态。它提供了一个统一的数据管理方式,确保应用程序状态的可预测性和可维护性。

以下是一个简单的Vuex示例:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  },
  getters: {
    doubleCount(state) {
      return state.count * 2
    }
  }
})

export default store

5.Vue工具

Vue提供了一系列工具和插件,帮助开发人员在开发过程中提高效率和开发体验。其中Vue Devtools是一个非常流行的Chrome插件,它提供了一个开发者友好的界面,帮助开发人员更容易地调试Vue应用程序。另外,Vue还提供了一些库和插件,例如Vue Router、Vuex、Vue CLI和Vue Test Utils等,帮助开发人员更好地构建和测试Vue应用程序。

二丶Django

一步到位Python Django部署,浅谈Python Django框架

Django是一个使用Python开发的Web应用程序框架,它遵循MVC(Model-View-Controller)设计模式,旨在帮助开发人员更快、更轻松地构建和维护高质量的Web应用程序。Django提供了强大的基础设施和工具,以便于处理复杂的业务逻辑、ORM映射、安全性等问题。

以下是一些Django开发的常见要素:

  • URL配置:Django提供了URL路由系统,使开发人员可以将请求映射到相应的视图函数上。

  • 视图函数:Django的视图函数处理器负责从请求中获取相应的数据,并根据逻辑处理从数据库中获取或更新数据,最后将结果返回给前端页面。

  • 模型:Django中的模型是指与数据库交互的Python类。开发人员可以使用ORM(对象关系映射)机制,将Python类与相应的数据库表映射起来,使数据操作更方便,同时保持了代码的可读性和可维护性。

  • 模板:Django的模板系统可帮助开发人员创建动态Web UI页面。开发人员可以通过使用Django模板语言(Django Template Language)将动态数据渲染到HTML页面上。

  • 表单:Django提供了表单处理和验证的功能,使用户能够轻松地提交数据,并保证数据的正确性。

  • 后台管理:Django提供了内置的后台管理系统,可帮助开发人员轻松管理Web应用程序的后台,包括添加、更新和删除数据、授权访问等。

总之,Django为开发人员提供了良好的Web应用程序开发基础设施、工具和规范,以便他们可以更快、更轻松地构建高质量的Web应用程序。

一丶Django初级

1. 什么是Django?

Django是一个遵循MVC(Model-View-Controller)体系结构的Web框架,旨在帮助开发人员更快、更轻松地构建和维护高质量的Web应用程序。它是用Python编写的,具有简单的语法和丰富的功能。

2. 安装Django

在使用Django之前,您需要安装它。您可以使用以下命令安装Django:

pip install django

3. 创建Django项目

要创建一个新的Django项目,请执行以下命令:

django-admin startproject myproject

“myproject”是您的项目名称。此命令将创建一个包含以下文件的新目录:

myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

4. 运行Django应用程序

要运行Django应用程序,请使用以下命令:

python manage.py runserver

该命令将启动开发Web服务器,该服务器将默认在localhost的8000端口上运行。

5. 创建Django应用程序

要创建一个新的Django应用程序,请执行以下命令:

python manage.py startapp myapp

“myapp”是您的应用程序名称。此命令将创建一个包含以下文件的新目录:

myapp/
   __init__.py
   admin.py
   apps.py
   models.py
   tests.py
   views.py

6. Django视图

Django视图是处理HTTP请求并返回HTTP响应的Python函数。要创建一个Django视图,请先定义一个Python函数,然后使用一个装饰器将其包装为视图:

from django.http import HttpResponse
    
def my_view(request):
    return HttpResponse("Hello, world")

上面的视图将在收到HTTP请求时响应“Hello, world”文本。

7. Django模板

Django模板是HTML文件,它允许您向HTML中动态添加数据。要使用Django模板,请定义一个HTML文件,并使用Django模板语言将数据插入到文件中:

{% extends "base.html" %}
    
{% block content %}
    <h1>{{ page_title }}</h1>
    <p>{{ page_content }}</p>
{% endblock %}

上面的代码将在扩展名为“base.html”的HTML模板中定义一个名为“content”的HTML块,并在其中插入由变量“page_title”和“page_content”引用的动态数据。

8. Django模型

Django模型是与数据库交互的Python类。要创建一个Django模型,请定义一个Python类,并在其中使用Django ORM(对象关系映射)定义属性和关系:

from django.db import models
    
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

上面的代码定义了一个名为Person的Django模型,它具有两个CharField属性:first_name和last_name。

9. Django管理员站点

Django管理员站点是一个内置的Web界面,用于轻松管理Django应用程序的后台。您可以通过在Django管理站点中注册Django模型来使其可管理:

from django.contrib import admin
    
from .models import Person
    
admin.site.register(Person)

上面的代码将在Django管理员站点中注册名为“Person”的Django模型。

二丶Django进阶

1. Django视图分类

Django支持不同类型的视图,可以根据需要创建以下类型的视图:

  • 函数视图:作为Python函数实现的基本Django视图。
  • 基于类的视图:基于Python类的Django视图,提供了许多额外功能。
  • 通用视图:预构建的Django视图,包括常见用例的功能。
  • 视图集:用于API的Django视图,支持CRUD(创建、读取、更新、删除)操作。

2. Django模板继承

Django模板继承是指在一个HTML文件中定义一个通用模板,并在其他HTML文件中扩展该模板。要使用Django模板继承,请创建一个包含通用块的基本HTML模板,并使用{% extends %}标记指定要扩展的模板:

<!-- base.html -->
    
<html>
<head>
    {% block head %}
       <title>{% block title %}My Site{% endblock %}</title>
    {% endblock %}
</head>
<body>
    {% block content %}
    {% endblock %}
</body>
</html>
<!-- child.html -->
    
{% extends "base.html" %}
    
{% block title %}My amazing website{% endblock %}
    
{% block content %}
   <p>Welcome to my amazing website!{% endblock %}

上面的代码将创建一个基本模板和一个扩展模板,并插入自定义块以呈现动态数据。

3. Django表单

Django的表单系统为您提供了创建HTML表单并处理表单数据的工具。要定义一个Django表单,请创建一个继承自Django的Form类的Python类:

from django import forms
    
class ContactForm(forms.Form):
    name = forms.CharField(max_length=100)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

上面的代码定义了一个名为ContactForm的Django表单,该表单具有三个表单字段:name、email和message。

4. Django中间件

Django中间件是一个可重用的软件组件,用于在HTTP请求和响应之间添加额外的功能。要创建一个Django中间件,请创建一个包含以下方法之一的Python类:process_request、process_view、process_exception或process_response。

class MyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
        # 每个请求都会执行这里
        response = self.get_response(request)
        # 每个响应都会执行这里
        return response

上面的代码定义了一个MyMiddleware类,其中__init__方法初始化中间件,__call__方法实现中间件的逻辑处理。

5. Django信号

Django信号是一种观察者模式,用于在Django应用程序中定义事件和基于事件执行的操作。要使用Django信号,请定义一个Python函数,并使用@receiver装饰器将该函数与信号关联:

from django.dispatch import receiver
from django.db.models.signals import post_save
from django.contrib.auth.models import User
    
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
       UserProfile.objects.create(user=instance)

上面的代码定义了一个名为create_user_profile的Python函数,并在post_save信号发生时与User模型相关联。

三丶Django高级

1. Django性能优化

Django性能优化是指通过一些技术和工具来提高Django应用程序的性能。以下是一些优化Django性能的最佳实践:

  • 启用缓存:使用缓存可以大大减少Django应用程序的响应时间。
  • 使用CDN:使用内容分发网络(CDN)可以加速Django应用程序的静态资源加载速度。
  • 开启Gzip压缩:启用Gzip压缩可以减少HTML、CSS和JavaScript文件的大小,从而提高页面加载速度。
  • 使用异步任务:使用异步任务队列可以将长时间或计算密集型的任务分配到后台计算资源,从而提高Django应用程序的响应速度。
  • 改进数据库查询:通过使用索引和合理的查询来优化数据库性能,可以提高Django应用程序的性能。
  • 将静态文件存储在第三方服务上:通过共享静态文件可以减轻Django应用程序的负载,从而提高响应速度。

2. Django安全性

Django安全性是指采取措施保护Django应用程序的数据和用户免受潜在威胁。以下是一些保护Django应用程序的最佳实践:

  • 使用HTTPS:使用HTTPS可以加密Django应用程序的所有传输数据,提高数据安全性。
  • 防范跨站点请求伪造(CSRF)攻击:Django提供了内置的CSRF保护措施,可防止恶意用户从其他网站上提交恶意请求。
  • 防范SQL注入攻击:使用ORM可以防止SQL注入攻击。
  • 防范跨站点脚本(XSS)攻击:对Django应用程序的输入进行过滤和转义可以防止XSS攻击。
  • 关闭调试模式:在生产环境中关闭Django应用程序的调试模式可降低恶意用户

三丶性能调优

一丶存储层调优

存储层是Web应用程序的重要组成部分,它负责存储和检索数据。在这篇文章中,我们将重点讨论存储层的调优,以提高Web应用程序的性能和扩展性。

1.数据库设计

好的数据库设计可以大大提高应用程序的性能和可扩展性。在设计数据库时,应遵循以下原则:

  • 正确的数据类型:选择正确的数据类型对于存储数据和检索数据都非常重要。应该避免使用不必要的数据类型,例如将整数存储为字符串等。
  • 索引的使用:索引可以帮助加快数据库的查询速度,但过多的索引会降低数据库的写入速度。因此,应该仅在必要时使用索引。
  • 数据库范式:数据库范式有助于减少数据冗余并提高数据一致性。但范式化的数据库可能需要较多的JOIN操作,从而降低了查询性能。因此,在设计数据库时应该找到一个平衡点。

2.数据库查询优化

数据库查询是影响Web应用程序性能的一个关键因素。以下是一些优化数据库查询的技术:

  • 只检索必要的列:避免检索不需要的列,这可以减轻数据库的负担并提高数据库查询性能。
  • 使用索引:索引可以帮助加快查询速度,但过多的索引会减慢写入速度。因此,在设计索引时需要找到一个平衡点。
    使用批量查询:批量查询允许同时发送多个查询,从而减少数据库交互次数,提高查询性能。
  • 避免全表扫描:使用WHERE子句或限制查询结果集的大小,可以避免对整个表的扫描,从而提高查询性能。

3.缓存

缓存是一种压缩数据和提高查询性能的技术。以下是一些使用缓存来优化数据库访问的技术:

  • 使用本地缓存:本地缓存可以缓存常用的数据并减少数据库访问。
  • 使用分布式缓存:分布式缓存可以缓存位于不同服务器上的数据,从而提高查询性能。
  • 使用缓存失效策略:缓存失效策略可以确保缓存中的数据与数据库中的数据保持同步,从而避免使用过时的数据。

4.数据库复制

将数据库复制到多个节点中可以提高应用程序的读取性能和容错能力。以下是一些使用数据库复制来优化应用程序的技术:

  • 主-从复制:在主服务器上写入数据,并在多个从服务器上读取数据。这可以有效地减轻主服务器的负担并提高读取性能。
  • 主-主复制:在多个主服务器上写入和读取数据,这可以提高应用程序的容错能力并减少单点故障。
  • 分区复制:将数据分区到不同的服务器上,可以提高查询速度并减少单个服务器的负荷。

综上所述,存储层调优是一项非常重要的任务,对Web应用程序的性能和可扩展性有很大的影响。通过优化数据库设计、查询、缓存和复制等方面,可以有效地提高Web应用程序的性能。

二丶celery异步任务

在Web应用程序中,有时需要执行长时间运行的任务,例如发送电子邮件、生成PDF文件等等。如果这些任务是同步执行的,会大大降低Web应用程序的性能和响应速度。这时候,异步任务就成为了一个很好的解决办法。Celery是一种流行的Python异步任务框架,可以帮助我们轻松地执行异步任务。

以下是Celery异步任务的一些优化技巧:

1.使用异步任务

如果长时间运行的任务无需立即返回结果,最好将其实现为异步任务。异步任务不会阻塞应用程序的主线程,并允许应用程序继续处理其他请求。对于需要执行的长时间计算或I/O操作,最好使用Celery来实现异步任务。

2.设置任务超时时间

如果不指定任务超时时间,那么当任务占用过多资源或无法按时完成时,将会一直持续执行。这会导致CPU和内存利用率过高,最终可能导致应用程序崩溃。因此,设置任务超时时间是很必要的。在Celery中,我们可以使用time_limit和soft_time_limit参数来设置任务超时时间。

3.密集型任务的并行化

如果有许多密集型任务需要执行,最好将它们并行化。Celery提供了一种方便的方式来并行化任务——使用并发任务。通过调整Celery的worker和concurrency配置,我们可以轻松地并行执行大量的任务。

4.任务结果缓存

如果您需要多次调用相同的异步任务并且任务结果不会频繁变化,最好将任务结果缓存在内存或持久性存储中。这样,应用程序可以更快地获取任务结果并避免重复执行相同的任务。Celery提供了一种方便的方式来缓存任务结果——使用缓存后端。

5.消息队列的优化

Celery使用消息队列来处理异步任务。对于高流量的应用程序,消息队列的性能是非常重要的。以下是一些优化消息队列的技巧:

  • 消息队列的选择:选用性能良好,可靠的消息队列非常重要,例如RabbitMQ,ActiveMQ,Redis,Kafka等。
  • 消息队列的配置:设置消息队列的预取计数和批量大小可以对消费者的效率产生重要影响。
  • 消息队列的监控:定期监视消息队列,以确保其性能和可用性。

综上所述,使用Celery进行异步任务执行是Web应用程序性能提升的一种重要手段。通过设置任务超时时间,密集型任务的并行化,任务结果的缓存以及消息队列的优化,可以更好的提高异步任务的执行效率和可靠性。

三丶Django缓存机制

在开发Web应用时,缓存是提高性能的重要手段之一。Django提供了多种缓存机制,包括内存缓存、文件系统缓存、数据库缓存以及缓存框架的扩展。本文将详细介绍Django缓存机制的使用和优化。

1.开启缓存

在Django的settings.py文件中,定义了以下缓存设置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

这个配置定义了一个名为“default”的缓存配置,使用的是MemcachedCache缓存后端,其中MemcachedCache是Django默认使用的缓存后端之一。其他的缓存后端包括本地内存缓存(LocMemCache)、文件系统缓存(FileBasedCache)和数据库缓存(DatabaseCache)等。除此之外,还可以使用第三方缓存后端,例如RedisCache、HDFSCache等。

启用缓存后,我们可以使用Django内置的缓存API进行缓存的读写操作。以下是一个简单的示例:

from django.core.cache import cache

# 缓存一个数据,有效期为100秒
cache.set('my_key', 'my_value', timeout=100)

# 从缓存中获取一个数据
my_data = cache.get('my_key')
if my_data is not None:
    # 命中缓存,使用缓存中的数据
    pass
else:
    # 没有命中缓存,执行其他操作
    pass

2.缓存键的设计

缓存键的设计非常重要,因为它决定了缓存的存储和访问方式。我们可以使用多种方式来生成缓存键,包括:

  • 使用URL和参数
    将URL和查询参数拼接为字符串,作为缓存键。这种方式适用于一些普通的查询页面,例如搜索结果页面。使用这种方式需要注意处理查询参数的顺序,避免因为参数顺序不同而生成不同的缓存键。

  • 使用数据库对象的主键
    使用数据库对象的主键作为缓存键。这种方式适用于针对特定对象的缓存,例如文章详情页面。

  • 自定义规则
    使用自定义规则生成缓存键。例如,使用时间戳等信息标记缓存的版本号,当内容变化时改变版本号。

在设计缓存键时,还需要考虑缓存失效时间和缓存命中率。对于不同的页面和需求,我们需要选择不同的缓存策略和失效时间。

3.使用缓存框架

Django缓存框架是Django自带的一个扩展性非常好的缓存工具,可以实现很多高级功能和自定义扩展。它可以运行在多种缓存后端上,并支持各种缓存策略,例如缓存失效时间、缓存版本、缓存依赖项等。缓存框架可以帮助我们轻松实现高效缓存,避免一些底层细节的繁琐处理。

需要注意的是,缓存框架并不是所有情况下都适用。对于一些特定的需求,我们可能需要自定义缓存机制以达到更好的性能和效果。

4.缓存清理机制

对于一些需要更新的内容,我们需要及时从缓存中清除相关数据。例如,当我们对某篇文章的内容进行修改时,需要及时的清除该缓存。Django提供了多种缓存清理策略,包括:

  • 手动清除:
    手动清除缓存是最常用的方法。我们可以在代码中调用cache.delete()方法来清除指定的缓存或所有缓存。

  • 自动清除:
    当使用自动缓存机制时,我们可以定义一些清理规则和条件,例如基于时间、基于缓存大小、基于缓存版本等。当达到一定条件时,缓存框架会自动的清理缓存。

5.缓存优化

Django缓存框架的性能直接影响Web应用的性能。以下是一些缓存优化的建议:

  • 使用高效的缓存后端。例如,使用Memcached作为缓存后端可以提高缓存访问速度和并发性能。

  • 避免生成重复的缓存数据。当有多份代码同时生成同一份缓存数据时,会导致不必要的缓存更新和失效操作,降低了缓存命中率。

  • 使用缓存分区。将不同类型的数据分别存储在不同的缓存分区中,避免不相关的数据混合在一起,降低了缓存命中率。

  • 使用缓存自增和自减。缓存自增和自减是一种高效的缓存更新方法,能够避免频繁的缓存查询和写入操作。

  • 合理设置缓存失效时间。不同类型的数据需要根据自身特点和需求设置不同的缓存失效时间,避免缓存数据的过度存储和无效消耗。

综上所述,Django的缓存机制是提高Web应用性能的重要手段之一。我们需要根据实际情况选择适当的缓存策略和缓存配置,优化缓存键的设计和缓存清理机制,同时关注缓存的性能和可扩展性。

四丶Nginx服务

Nginx是一款轻量级、高性能的Web服务器和反向代理服务器,常用于构建高可用性和高性能的Web应用程序。在全栈开发中,Nginx的优化非常重要,因为它可以直接影响Web应用程序的性能和可靠性。本文将详细介绍Nginx的优化和性能调优方法。

1.合理配置Nginx

在使用Nginx时,我们需要合理配置Nginx,包括调整worker进程数、连接数、缓存等参数。以下是一些建议:

  • 调整worker进程数:
    worker进程数的大小直接影响Nginx的性能,因此需要根据服务器的硬件资源和实际负载情况来设置合适数量的worker进程。可以使用nginx -t命令检查配置文件是否存在错误和nginx -s reload命令重新加载配置。

  • 调整连接数:
    连接数的设置也是很重要的,在高并发访问时会导致性能瓶颈。Nginx提供了keepalive_timeout用于指定空闲连接的最长时间,在该时间内都保持连接。需要根据实际情况,合理设置keepalive_timeout和最大连接数。

  • 使用缓存:
    Nginx也提供了缓存机制,可以使用ngx_http_proxy_module模块的proxy_cache_path指令设置缓存路径和缓存大小。使用缓存可以有效减少服务器压力,提高响应速度。

2.使用Nginx的高级功能

Nginx提供了许多高级功能和扩展,例如负载均衡、HTTPS、反向代理、动态模块、页面压缩等。这些功能可以帮助我们实现高可用性、高性能的Web应用程序。以下是一些建议:

  • 使用负载均衡:
    负载均衡是一种将负载分配到多个服务器的技术,可以提高Web应用程序的可用性和性能。Nginx提供了四种负载均衡算法:轮询、IP Hash、fair和random,可以根据具体情况选择合适的负载均衡算法。

  • 使用HTTPS:
    HTTPS是一种安全的Web连接协议,可以保障数据安全和隐私。Nginx提供了SSL支持,可以使用ngx_http_ssl_module模块设置HTTPS证书,实现HTTPS协议访问。

  • 使用反向代理:
    反向代理是一种代理方式,可以将请求转发到多个服务器,并将响应返回给客户端。Nginx可以作为反向代理服务器,可以实现负载均衡、缓存和安全等功能。

  • 使用动态模块:
    动态模块是一种以插件形式添加到Nginx中的模块,可以添加一些高级功能和支持新的协议。例如,Nginx提供了ngx_http_lua_module模块,可以使用Lua脚本扩展Nginx。

  • 页面压缩:
    Nginx支持启用gzip功能,可以对HTML、CSS、JS等静态资源进行压缩,减少页面响应时间和网络带宽的消耗。

3.监控和优化Nginx

对于Nginx的监控和优化也非常重要,可以实时发现和解决问题,提高Web应用程序的性能和可靠性。以下是一些建议:

  • 监控Nginx:
    可以使用Nginx中的ngx_http_stub_status_module模块,实时监控Nginx的状态和性能指标,例如连接数、请求处理时间、错误率等。

  • Nginx日志:
    Nginx提供了多种日志格式和日志记录级别,可以记录访问信息、错误信息和调试信息。使用Nginx日志可以帮助我们实时了解Web应用程序的状态和性能指标。

  • Nginx性能优化:
    可以使用一些性能优化技术,例如HTTP缓存、资源合并和压缩、DNS预载等,提高Web应用程序的性能和质量。

综上所述,Nginx的优化和性能调优对于全栈开发非常重要。我们需要合理配置Nginx、使用Nginx的高级功能和扩展、监控和优化Nginx,才能构建高可用性、高性能的Web应用程序。

四丶Django对SDK开发

Django是一款流行的Python Web框架,它提供了一种快速开发Web应用程序的方式,包括一系列的开发工具和库。在全栈开发中,Django的SDK开发也非常重要,因为它可以直接影响到Web应用程序的性能和可靠性。本文将介绍如何使用Django进行SDK开发和性能调优。

1.创建Django SDK项目

首先,我们需要使用Django创建一个新的项目,可以使用如下命令:

django-admin startproject myproject

该命令将会创建一个名为myproject的Django项目,并且Django将会自动创建一些必要的文件。接下来,我们将会在该项目中创建SDK应用程序。

2.创建Django SDK应用程序

在Django项目中,我们可以通过如下命令创建一个新的应用程序:

python manage.py startapp sdkapp

该命令将会创建一个名为sdkapp的应用程序目录,并且Django将会自动创建一些必要的文件。接下来,我们需要在应用程序中创建一些视图函数和API,来处理请求和返回响应。

3.创建Django SDK视图函数

在Django SDK应用程序中,我们需要创建一些视图函数,来实现API的功能。下面是一个示例视图函数:

from django.http import JsonResponse

def hello(request):
    return JsonResponse({'message': 'Hello, world!'})

该视图函数将会接收一个名为request的请求对象,并且返回一个JSON格式的响应,其中包含一条消息:“Hello, world!”。我们可以使用Django的路由系统将该视图函数映射到一个API接口上。

4.创建Django SDK路由

在Django中,我们可以使用urls.py文件来定义路由,将URL地址映射到对应的视图函数上。下面是一个示例路由定义:

from django.urls import path
from sdkapp.views import hello

urlpatterns = [
    path('hello', hello, name='hello'),
]

在该示例中,我们定义了一个名为hello的API接口,它将会使用我们之前创建的hello视图函数来处理请求。我们可以将该路由添加到Django主应用程序中,例如myproject/urls.py文件中。

5.进行Django性能调优

对于Django的SDK开发,性能调优也是非常重要的,可以有效提高Web应用程序的性能和可靠性。以下是一些常用的性能调优技术:

  • 去除不必要的中间件:
    Django提供了许多中间件来执行各种任务,例如安全策略、缓存和认证。但是,使用太多的中间件可能会影响性能,因此我们需要选择合适的中间件,并去除不必要的中间件。

  • 缓存:
    Django提供了多种缓存方式,可以缓存视图函数、模板和数据查询结果等,以提高响应速度。例如,我们可以使用Django内置的缓存装饰器来缓存响应内容。

  • 数据库调优:
    Django中的ORM已经为我们处理了大部分数据库操作,但是在处理大量数据时,我们还需要考虑一些数据库调优技术,例如索引优化、查询优化和分表等。

  • 使用异步任务:
    Django提供了异步任务支持,可以使用Celery和Redis等工具来实现。异步任务可以将一些耗时的操作放到后台执行,避免阻塞主线程,提高Web应用程序的性能和响应速度。

  • 使用Web服务器:
    在生产环境中,通常会使用Web服务器来部署Django应用程序,例如Apache、Nginx和Gunicorn等。这些Web服务器都提供了一些性能调优的选项,例如启用缓存、压缩和负载均衡等。

综上所述,Django的SDK开发和性能调优对于全栈开发非常重要。我们需要创建Django项目和应用程序、定义视图函数和路由,并进行合适的性能调优,以构建高可用性、高性能的Web应用程序。

五丶Docker容器

Docker是一种轻量级的容器技术,可以将应用程序和依赖项打包到一个可移植的容器中,使得应用程序可以在任何环境中运行,而无需担心环境配置问题。对于全栈开发而言,Docker可以帮助我们将应用程序在开发、测试和生产环境中轻松部署,同时也可以提高应用程序的可靠性和性能。本文将介绍如何使用Docker容器来进行全栈开发的性能调优。

1.Docker容器基础知识

在使用Docker进行全栈开发时,首先需要了解Docker容器的基础知识,包括以下概念:

  • 镜像(Image):Docker容器的静态模板,包含了运行容器所需的所有依赖项、配置文件和应用程序。可以通过Dockerfile来定义镜像。

  • 容器(Container):Docker镜像的运行实例,可以在容器中运行应用程序和服务。容器可以随时启动、停止、删除和重启。

  • Dockerfile:Docker镜像的定义文件,包含了容器运行所需的所有配置信息,例如基础镜像、依赖项安装、环境变量和启动命令等。

2.使用Docker部署全栈应用

使用Docker部署全栈应用程序通常需要创建多个容器,每个容器负责运行一个服务或应用程序。例如,我们可以创建一个Nginx容器来处理Web请求,一个数据库容器来处理数据存储,一个后端应用程序容器来处理业务逻辑,一个前端应用程序容器来提供Web界面等。

在Docker中,我们可以使用docker-compose工具来定义和管理多个容器的运行状态。docker-compose使用YAML文件来描述多个容器的配置和依赖关系。例如,下面是一个简单的docker-compose.yml文件示例:

version: '3'
services:
  web:
    build: ./myapp
    ports:
      - "8000:8000"
  db:
    image: postgres

在上述示例中,我们定义了两个Docker容器:web和db。web容器使用了myapp目录下的Dockerfile进行构建,并将容器的8000端口映射到主机的8000端口上。db容器使用了PostgreSQL官方镜像进行构建。

3.使用Docker进行性能调优

使用Docker部署应用程序为我们提供了很多性能调优的机会,例如:

  • 减少镜像大小:镜像大小对容器启动时间和网络传输速度有直接影响。我们可以通过使用多阶段构建、选择合适的基础镜像和清理无用文件等方式来减少镜像大小。

  • 优化容器资源:在Docker容器中,我们可以设置容器的CPU、内存、磁盘等资源限制和优先级。我们需要根据应用程序的特点和负载情况来配置容器资源。

  • 使用容器间通信:在全栈应用程序中,不同容器之间需要相互通信。我们可以使用Docker网络来实现容器间通信,可以选择不同的网络类型和协议,例如桥接网络、覆盖网络和Overlay网络等。

  • 持久化数据存储:在Docker容器中,文件系统是临时的,容器重新启动后,所有数据将会丢失。因此,我们需要使用持久化存储来保存数据,例如使用本地卷或网络存储,以保证数据的可靠性和持久性。

综上所述,使用Docker容器部署应用程序可以帮助我们更方便地进行全栈开发,同时也可以使用Docker容器来进行性能调优和优化。我们需要了解Docker容器的基础知识、使用docker-compose管理多个容器的运行状态,并针对具体应用程序的需求来进行性能调优。

本系列文根据以下学习路线展开讲述,由于内容较多,:

从零开始学python到高级进阶路线图

关注公众号:python技术训练营,学习进阶一步到位

适用于零基础学习和进阶人群的python资源:

① 腾讯认证python完整项目实战教程笔记PDF
② 十几个大厂python面试专题PDF
③ python全套视频教程(零基础-高级进阶JS逆向)
④ 百个项目实战+源码+笔记
⑤ 编程语法-机器学习-全栈开发-数据分析-爬虫-APP逆向等全套项目+文档
⑥ 交流学习
⑦ 想要兼职接单

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ArcGIS Pro微课1000例】0028:绘制酒店分布热力图(POI数据)

本文讲解在ArcGIS Pro中文版中,基于长沙市酒店宾馆分布矢量点数据(POI数据)绘制酒店分布热力图。 文章目录 一、加载酒店分布数据二、绘制热度图参考阅读: 【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图 【ArcGIS微课1000例】0070:制作宾馆酒店分布热度热力图 一、加载…

【java爬虫】将优惠券数据存入数据库排序查询

本文是在之前两篇文章的基础上进行写作的 (1条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 (1条消息) 【java爬虫】使用selenium获取某宝联盟淘口令_haohulala的博客-CSDN博客 前两篇文章介绍了如何获取优惠券的基础信息&#xff0c;本文将获取到的…

mybatis-plus中的逻辑删除

官网&#xff1a;逻辑删除 | MyBatis-Plus 1.数据库字段 得有一个字段用来表示是否被删除。 记得加上注解TableLogic 也可以加上值&#xff0c;表示被删除具体得值&#xff0c;和没有被删除具体的值。 TableLogic(value "1",delval "0") 源码&#…

go语言中的string类型简介

在 Go 中&#xff0c;String 是一种不可变的类型&#xff0c;不能被修改。 在 Go 语言中&#xff0c;字符串由 Unicode 字符组成&#xff0c;每个字符都可以用一个或多个字节来表示。我们使用双引号或反引号来定义字符串&#xff0c;使用反引号定义的字符串不会对其内容进行任何…

FPGA Verilog移位寄存器应用:边沿检测、信号同步、毛刺滤波

文章目录 1. 端口定义2. 边沿检测3. 信号同步4. 信号滤波5. 源码6. 总结 输入信号的边沿检测、打拍同步、毛刺滤波处理&#xff0c;是FPGA开发的基础知识&#xff0c;本文介绍基于移位寄存器的方式&#xff0c;实现以上全部功能&#xff1a;上升沿、下降沿、双边沿检测、输入信…

21.基于注解的自动装配

基于注解的自动装配 通过Autowired注解即可完成自动装配 Autowired注解标识的位置 成员变量上&#xff1a;直接标记Autowired注解即可完成自动装配&#xff0c;不需要提供setXxx()方法成员变量set方法上&#xff1a;直接标记Autowired注解即可完成自动装配成员变量赋值的有参…

C++函数对象与函数指针在sort上的性能测试

最近在比较函数对象和函数指针的性能&#xff0c;看了一些文章&#xff0c;国内的如&#xff1a; https://zhuanlan.zhihu.com/p/579128724 上面这篇文章是在GoogleTest当中进行测试的&#xff0c;其测试结果仅展示了一次&#xff0c;因此我认为不具备说服力&#xff0c;因为我…

风雨中茁壮成长的程序树-深入浅出2023-迟来的总结

起点所在&#xff1b; 反观2021年的时候&#xff0c;入行半年多的当时还是艰难万分啊。真的犹如创业艰难百战多&#xff0c;无数的风雨和重大压力的遭遇&#xff0c;甚至于当时第一家company的时候产生过放弃的念头。 Yes,当时时有产生放弃的念头的。 because当时入行时候的收…

【人工智能】从零开始的口罩识别系统

文章目录 前言第零章 环境准备Python环境安装安装labelimgAI StudioYOLO2COCOPaddleYOLOnumpy 猫狗分类数据集实战数据上传新建项目 前言 本文是从零开始搭建口罩识别系统的学习过程总结&#xff0c;涉及到的软件环境、硬件环境、代码、操作都会一一给出。 第零章 环境准备 …

Python实现PSO粒子群优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

iconfont渐变色实现方案总结

iconfont是前端技术中重要的一环——它能够方便地沉淀大量设计资产&#xff0c;并通过组件化的方式高效地在各种场景复用。而单纯应用iconfont&#xff0c;只能支持到纯色渲染图标&#xff0c;越来越难以满足高品质视觉效果的诉求。本文结合实际工作业务场景&#xff0c;调研了…

大数据面试题:Kafka的消费者和消费者组有什么区别?为什么需要消费者组?

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;1&#xff09;说下Kafka的消费者和消费者组&#xff0c;以及它们的作用是什么&#xff1f; 参考答案&#xff1a; 1、什么是消费…

C++ 测试框架 GoogleTest 初学者入门篇

开发者虽然主要负责工程里的开发任务&#xff0c;但是每个开发完毕的功能都是需要开发者自测通过的&#xff0c;所以经常会听到开发者提起单元测试的话题。那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C 测试框架 GoogleTest. 简单介绍 来看看谷歌官方是怎么介绍这个框架的&am…

数据结构(王卓版)——线性表

数据的存储结构之线性表 1、线性表的定义和特点 线性表的顺序存储结构 总结&#xff1a;

免费音频转文字的软件有哪些?分享这几个给大家!

在今天的数字化时代&#xff0c;音频转文字变得越来越常见和重要。无论是为了记录会议内容、制作字幕&#xff0c;还是为了更方便地查找和检索音频信息&#xff0c;免费的音频转文字软件可以帮助你实现这一目标。以下是几个方法&#xff0c;可以帮助你将音频转换为文字。 方法…

23年进阶高级测试,性能测试超细详解(附面试题+答案)一篇打通

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 用户视角&#xf…

从2050回顾2020,职业规划与技术路径(节选)补充

很多朋友问了其中一段&#xff1a; 文明的提升&#xff0c;源于机械/能源/信息/智能四大模式的转变。机械将自然力或人力更高效利用&#xff0c;如风车&#xff0c;能源以蒸汽机为代表开启工业革命&#xff0c;信息启动了互联网时代&#xff0c;智能将实现虚拟社区的主导模式。…

CS 144 Lab One

CS 144 Lab One 实验结构环境配置如何调试StreamReassembler 实现 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab 1 对应的PDF: Lab Checkpoint 1: stitching substrings into a byte stream 实验结构 这幅图完整的说明了CS144 这门实验的结构&#xff1a; 其中&am…

【C++】多线程编程三(std::mutexstd::mutex、std::lock_guard、std::unique_lock详解)

目录 一、线程间共享数据 1.数据共享和条件竞争 2.避免恶性条件竞争 二、用互斥量来保护共享数据 1. 互斥量机制 2.mutex头文件介绍 三、C中使用互斥量mutex 1. 互斥量mutex使用 2.mutex类成员函数 ① 构造函数 ② lock() ③ unlock() ④ try_lock() 四、使用std::…

本地服务器localhost:3000一直连接不上

1.检查使用端口3000的进程: 在Windows上,运行 netstat -ano | findstr :3000在Mac/Linux上,运行lsof -i :3000 这将列出当前使用端口3000的任何进程。您要终止这些进程以释放该端口。 2.检查防火墙规则: 确保您的防火墙允许连接到localhost:3000。在MacOS和Windows上,通常不…