掌握文件锁:使用flock实现多个进程之间的无缝文件同步

news2024/9/23 13:27:12

使用flock实现多个进程之间的无缝文件同步?

  • 博主简介
  • 一、引言
  • 二、文件锁的概述
    • 2.1、定义文件锁
    • 2.2、文件锁的种类
    • 2.3、文件锁的作用
  • 三、使用flock实现文件锁
    • 3.1、flock的简介
    • 3.2、flock的使用方法
    • 3.3、flock文件锁命令
    • 3.4、flock对文件同步的帮助
  • 四、实现多个进程之间的无缝文件同步
    • 4.1、进程之间的文件同步问题
    • 4.2、使用Flock实现同步的步骤
    • 4.3、处理竞争条件
  • 五、使用flock实现的文件同步工具
  • 总结

博主简介


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星,CSDN博客专家
👉
👉我的博客将为你提供以下内容:
👉
💡1. 高性能服务器后台开发知识深入剖析:我将深入探讨各种技术的原理和内部工作机制,帮助你理解它们的核心概念和使用方法。
👉
💡2. 实践案例与代码分享:我将分享一些实际项目中的应用案例和代码实现,帮助你将理论知识转化为实际应用,并提供实践中的经验和技巧。
👉
💡3. 技术教程和指南:我将编写简明扼要的教程和指南,帮助初学者入门并逐步掌握这些技术,同时也为有经验的开发者提供深入的技术进阶指导。
👉
💡无论你是一个刚入门的初学者,还是一个有经验的开发者,我的博客都将为你提供有价值的内容和实用的技术指导。让我们一起探索高性能服务器后台开发的奥秘,共同成长!


一、引言

文件同步的重要性在于确保多个进程或系统中的文件保持一致性。当多个进程之间需要对同一个文件进行读写操作时,如果没有文件同步机制,可能会导致数据不一致的问题。例如,在一个网络文件系统中,多个客户端同时对同一个文件进行写操作,如果没有文件同步机制,可能会导致文件内容不一致或丢失的问题。

文件同步能够解决并发写入、读取文件的竞争条件,确保文件的一致性和完整性。通过文件同步机制,可以实现多个进程之间的无缝文件同步,避免数据的丢失和错误。文件同步还可以提供错误处理和异常情况下的恢复机制,保证系统的可靠性和稳定性。

另外,文件同步还可以提高系统的性能。通过合理的文件同步策略,可以减少文件的读写冲突,提高系统的并发性能和响应能力。文件同步可以避免冲突,减少延迟,提高系统的吞吐量和效率。

因此,文件同步对于系统的可靠性、一致性和性能至关重要。通过文件同步机制,可以确保文件的一致性和完整性,保证系统的可靠性和稳定性,提高系统的并发性能和响应能力。

二、文件锁的概述

2.1、定义文件锁

文件锁是一种机制,用于控制对文件的访问和操作。它可以防止多个进程或线程同时对同一个文件进行读写操作,避免出现竞争条件和数据错误。

文件锁通常分为两种类型:共享锁和排他锁。当一个进程获取共享锁时,其他进程也可以获取共享锁,但无法获取排他锁。而当一个进程获取排他锁时,其他进程无法获取共享锁或排他锁。

文件锁可以通过操作系统提供的函数或系统调用来实现,如fcntl、flock等。通过调用这些函数,进程可以获取、设置和释放文件锁。当一个进程获取了文件锁后,其他进程在尝试获取相同类型的锁时,会被阻塞,直到文件锁被释放。

文件锁可以用于避免并发读写文件时的竞争条件和数据不一致问题。同时,文件锁也可以用于控制对共享资源的访问,确保数据的完整性和一致性。

文件锁是一种重要的机制,用于控制对文件的并发访问,并确保数据的一致性和完整性。它可以通过操作系统提供的函数来实现,对于系统的可靠性和性能至关重要。

2.2、文件锁的种类

文件锁主要分为两种类型:共享锁和排他锁。

共享锁(Shared Lock):多个进程可以同时获取共享锁,并且可以并发地读取文件内容,但是不能进行写操作。共享锁可以用于实现多进程的并发读取,并且共享锁之间不会互斥。

排他锁(Exclusive Lock):只有一个进程可以获取排他锁,并且其他进程无法同时获取共享锁或排他锁。当一个进程获取排他锁时,其他进程无法读取或写入文件内容。排他锁用于实现独占式的写操作,保护数据的一致性和完整性。

除了共享锁和排他锁,还存在其他的锁类型,例如记录锁(Record Lock)、写入锁(Write Lock)等。不同类型的文件锁适用于不同的并发访问场景,具体使用哪种类型的文件锁要根据具体的需求和操作来确定。

2.3、文件锁的作用

文件锁的作用是为了保护文件或数据的并发访问。它可以避免多个进程同时对同一个文件进行读写操作而导致的数据不一致或损坏。

文件锁可以实现以下几个方面的作用:

  • 保证数据一致性:在多个进程同时访问文件时,通过文件锁可以确保只有一个进程可以进行写入操作,避免多个进程同时写入导致的数据冲突或覆盖。

  • 防止数据损坏:文件锁可以防止多个进程同时对同一个文件进行写入操作,避免在写入过程中发生数据冲突或覆盖,从而保证数据的完整性。

  • 确保读写顺序:文件锁可以限制同时访问文件的进程数量,从而保证读写操作的顺序性,避免并发读写引起的读取不到最新的数据或写入被覆盖的问题。

  • 并发读取:文件锁中的共享锁可以允许多个进程同时获取共享锁,从而实现并发读取文件内容,提高读取效率。

三、使用flock实现文件锁

3.1、flock的简介

文件锁(flock)是一种用于在Unix和类Unix系统上控制文件访问的机制。它是在文件级别上实现同步和互斥的一种方式,旨在防止多个进程同时对同一个文件进行读写操作而引发的数据不一致或竞态条件问题。

文件锁通常用于多进程或多线程环境中,确保在某个进程或线程正在访问文件时,其他进程或线程无法同时进行相同或类似的操作,从而避免数据冲突和损坏。

在Unix系统中,常见的文件锁类型有两种:

共享锁(Shared Lock):多个进程可以同时持有共享锁,允许它们以只读方式打开文件,但不允许进行写操作。这适用于多个进程需要读取文件内容,但不会修改文件的情况。

排他锁(Exclusive Lock):排他锁是独占性的,一次只能由一个进程持有。持有排他锁的进程可以读取和写入文件内容,其他进程无法同时持有共享锁或排他锁。

使用文件锁的目的是确保对文件的访问是线程安全的,并防止不同进程之间产生数据竞争和损坏。文件锁在编程中经常用于处理共享资源的并发访问,以确保数据的完整性和一致性。

3.2、flock的使用方法

在Linux环境下,可以使用flock函数来对文件进行加锁操作。

flock函数的声明如下:

int flock(int fd, int operation);

该函数接受两个参数:

  • fd:文件描述符,表示要加锁的文件。
  • operation:加锁的操作,可以是以下几种取值之一:
    • LOCK_SH:共享锁,用于读取文件时使用,多个进程可以同时加共享锁。
    • LOCK_EX:独占锁,用于写入文件时使用,只能有一个进程加独占锁。
    • LOCK_UN:解锁,用于释放已经加锁的文件。

示例代码如下:

#include <unistd.h>
#include <fcntl.h>

int main() {
    int fd = open("file.txt", O_RDWR); // 打开文件
    if (fd == -1) {
        perror("open"); // 打开文件失败
        return -1;
    }

    if (flock(fd, LOCK_EX) == -1) { // 加独占锁
        perror("flock"); // 加锁失败
        close(fd); // 关闭文件
        return -1;
    }

    // 对文件进行读写操作

    if (flock(fd, LOCK_UN) == -1) { // 解锁
        perror("flock"); // 解锁失败
    }

    close(fd); // 关闭文件

    return 0;
}

在代码中,首先使用open函数打开文件,然后使用flock函数加锁,并指定加独占锁。在对文件进行读写操作之后,使用flock函数解锁,并使用close函数关闭文件。

注意:flock函数只对同一个进程有效,不同进程之间的文件加锁需要使用其他机制,如fcntl函数的F_SETLK命令或使用文件锁定(flock)命令。

3.3、flock文件锁命令

flock 是一个用于在 Unix/Linux 系统上进行文件锁定的命令行工具。它允许进程在访问共享资源时使用文件锁定机制,以确保数据的完整性和一致性,防止数据竞争和损坏。flock 命令可用于 shell 脚本中,也可以直接在终端中使用。

flock 命令的基本语法如下:

flock [options] <file> <command>

其中,file 是需要进行文件锁定的目标文件的路径,command 是在获得文件锁定之后要执行的命令。当命令执行完成后,文件锁会被自动释放。

flock 命令支持以下常用的选项:

  • -c, --command :指定在获得文件锁定后要执行的命令。可以使用单引号将命令包围起来,以避免 shell 对命令进行解释。
  • -s, --shared:使用共享锁。多个进程可以同时持有共享锁。
  • -x, --exclusive:使用排他锁。一次只能由一个进程持有排他锁。
  • –timeout :设置获取锁的超时时间,如果在指定时间内无法获取锁,则命令执行失败。
  • –help:显示帮助信息。

以下是几个 flock 命令的使用示例:

  • 以排他锁方式运行一个命令:
flock -x /tmp/lockfile.lock some_command

这会尝试获取名为 /tmp/lockfile.lock 的文件的排他锁,如果成功,则执行 some_command。

  • 以共享锁方式运行一个命令:
flock -s /tmp/lockfile.lock some_command

这会尝试获取名为 /tmp/lockfile.lock 的文件的共享锁,如果成功,则执行 some_command。

  • 在获取锁后执行一段脚本:
flock /tmp/lockfile.lock -c 'echo "This is a locked operation"'

这会以排他锁方式获取 /tmp/lockfile.lock 文件的锁,并执行 echo “This is a locked operation” 命令。

注意:使用 flock 命令时,需要对目标文件所在的目录有读写权限,否则可能会出现权限问题。同时,flock 命令只能对文件进行锁定,无法跨进程或跨计算机实现锁定。在跨进程通信的场景中,需要使用其他机制来实现进程间的同步。

3.4、flock对文件同步的帮助

flock函数在文件同步(file synchronization)方面提供了帮助。文件同步是指在多进程或多线程环境下,对共享文件的访问进行控制,以避免数据不一致或竞争条件。flock函数可以用于在文件访问期间加锁,以确保同一时刻只有一个进程(或线程)能够访问该文件,从而避免并发访问的问题。

当一个进程获得了独占锁(LOCK_EX)时,其他进程试图以LOCK_SH或LOCK_EX加锁都会被阻塞,从而保证了文件的互斥访问。而如果使用LOCK_SH共享锁,则其他进程可以以LOCK_SH加锁来读取文件,但是以LOCK_EX加锁的写入操作会被阻塞,从而实现了读共享、写独占的访问策略。

需要注意的是,flock函数是基于文件描述符的,因此同一文件如果以不同的文件描述符多次打开,需要确保在每个文件描述符上正确加锁和解锁,否则文件同步的机制可能无效。而且,flock函数只对同一个操作系统的进程间有效,不同操作系统的进程之间的文件锁可能不具备互斥性。

在进行文件加锁时,建议在合适的位置捕获错误并处理,避免出现潜在的问题。

四、实现多个进程之间的无缝文件同步

4.1、进程之间的文件同步问题

进程之间的文件同步问题是一个重要的并发编程问题。当多个进程同时访问同一个文件时,需要确保数据的正确性和一致性,避免出现竞争条件和数据不一致的情况。

在Unix/Linux系统中,可以使用文件锁(file lock)来解决进程之间的文件同步问题。文件锁是一种同步机制,它可以防止多个进程同时对同一个文件进行读写操作,从而保证数据的完整性。

常见的文件锁机制包括:

  • flock函数:flock函数是Unix/Linux系统提供的文件锁定函数,它可以对整个文件进行加锁和解锁操作。可以使用LOCK_SH来实现读共享锁(多个进程可以同时读取文件),使用LOCK_EX来实现写独占锁(只有一个进程可以写入文件),使用LOCK_UN来解锁文件。

  • fcntl函数:fcntl函数也是Unix/Linux系统提供的文件控制函数,通过设置文件描述符的属性实现加锁和解锁。可以使用F_SETLK命令来设置锁,使用F_UNLCK命令来解锁文件。

在使用文件锁时,需要注意:

  • 同一文件如果以不同的文件描述符多次打开,需要在每个文件描述符上正确加锁和解锁,否则文件同步的机制可能无效。

  • 文件锁只对同一个操作系统的进程间有效,不同操作系统的进程之间的文件锁不具备互斥性。

  • 文件锁的粒度可以是整个文件,也可以是文件的某个区域(记录锁)。记录锁是一种更细粒度的锁,可以对文件的某部分进行加锁,而不是整个文件。

  • 在进行文件加锁时,建议在合适的位置捕获错误并处理,避免出现潜在的问题。

进程之间的文件同步问题可以通过合理使用文件锁机制来解决,确保多个进程对共享文件的访问是有序的,从而保证数据的正确性和一致性。

4.2、使用Flock实现同步的步骤

使用flock函数实现文件同步的步骤如下:

  1. 打开需要同步的文件,可以使用open函数进行文件打开操作,获取文件描述符。例如:int fd = open("filename", O_RDWR);

  2. 在需要对文件进行加锁的地方,使用flock函数进行文件锁定。flock函数的原型为:int flock(int fd, int operation);其中,fd为文件描述符,operation为进行的操作,可以是LOCK_SH表示共享锁(读锁),LOCK_EX表示独占锁(写锁),LOCK_UN表示解锁。

  3. 在进行加锁操作后,需要判断加锁是否成功。如果加锁失败,可以通过返回值进行判断,一般返回-1表示加锁失败。可以使用perror("flock");输出错误信息,以便调试。

  4. 在对文件操作完成后,需要进行解锁操作。使用flock函数,并将operation参数设置为LOCK_UN,表示解锁。例如:flock(fd, LOCK_UN);

  5. 最后,使用close函数关闭文件描述符,释放资源。例如:close(fd);

注意:文件锁是以进程为单位的,所以在不同进程之间使用flock函数进行文件同步,需要保证它们对同一个文件进行操作,并且使用相同的文件描述符。同时,也需要注意加锁和解锁的顺序,以避免死锁等问题的发生。

4.3、处理竞争条件

处理竞争条件是在多进程或多线程环境中经常面临的问题。竞争条件指的是多个进程(或线程)同时访问共享资源,而且对这些资源的访问顺序不确定,可能导致结果出现不符合预期的情况。在文件操作中,竞争条件可能导致数据损坏或不一致的结果。

使用文件锁(flock函数)可以一定程度上处理竞争条件,但并不能完全解决所有问题。处理竞争条件的一般性策略:

  • 使用文件锁:通过在关键代码段前后设置文件锁,确保同一时刻只有一个进程(或线程)可以访问共享资源。这样可以避免多个进程同时对文件进行写入操作,从而减少竞争条件的发生。

  • 加锁顺序:如果多个进程需要同时访问多个资源,建议按照统一的顺序加锁,以避免死锁。死锁是指多个进程相互等待对方释放资源,从而导致所有进程都无法继续执行的情况。

  • 临界区保护:将对共享资源的访问限制在临界区内,临界区是指一段代码,在进程进入此代码段前会获取锁,在离开代码段后会释放锁。这样可以确保在访问共享资源时不会被其他进程中断。

  • 使用同步工具:除了文件锁,还可以使用其他同步工具,如互斥锁、条件变量等,来保护共享资源的访问。不同的同步工具适用于不同的场景,需要根据具体情况进行选择。

  • 设计良好的算法:在多进程或多线程环境中,尽量避免复杂的同步和竞争条件,尽量采用简单且线程安全的算法和数据结构,以减少潜在的问题。

  • 错误处理:对于文件锁或其他同步工具的操作,要及时检查其返回值,以便发现加锁或解锁失败的情况,并进行相应的错误处理。

五、使用flock实现的文件同步工具

当在C++中使用flock函数来实现文件同步工具时,需要包含相应的头文件,并编写相应的代码逻辑。以下是一个简单的示例:用于在Unix环境下使用flock实现文件同步的读写操作。

#include <iostream>
#include <string>
#include <fstream>
#include <fcntl.h>
#include <unistd.h>

// 函数用于获取共享锁,并向文件写入数据
void writeToFile(const std::string& filename, const std::string& data) {
    int fileDescriptor = open(filename.c_str(), O_WRONLY | O_CREAT, 0666);
    if (fileDescriptor == -1) {
        std::cerr << "Error opening file: " << filename << std::endl;
        return;
    }

    if (flock(fileDescriptor, LOCK_SH | LOCK_NB) == -1) {
        std::cerr << "Error acquiring shared lock on file: " << filename << std::endl;
        close(fileDescriptor);
        return;
    }

    // 获取锁后,将数据写入文件
    std::ofstream outfile;
    outfile.open(filename, std::ios::app);
    outfile << data << std::endl;
    outfile.close();

    // 释放锁和关闭文件
    flock(fileDescriptor, LOCK_UN);
    close(fileDescriptor);
}

// 函数用于获取共享锁,并从文件读取数据
std::string readFromFile(const std::string& filename) {
    int fileDescriptor = open(filename.c_str(), O_RDONLY);
    if (fileDescriptor == -1) {
        std::cerr << "Error opening file: " << filename << std::endl;
        return "";
    }

    if (flock(fileDescriptor, LOCK_SH | LOCK_NB) == -1) {
        std::cerr << "Error acquiring shared lock on file: " << filename << std::endl;
        close(fileDescriptor);
        return "";
    }

    // 获取锁后,从文件读取数据
    std::ifstream infile;
    infile.open(filename);
    std::string data;
    std::string line;
    while (std::getline(infile, line)) {
        data += line + "\n";
    }
    infile.close();

    // 释放锁和关闭文件
    flock(fileDescriptor, LOCK_UN);
    close(fileDescriptor);

    return data;
}

int main() {
    std::string filename = "example.txt";

    // 写入数据到文件
    writeToFile(filename, "Hello, World!");

    // 从文件读取数据
    std::string data = readFromFile(filename);
    std::cout << "Data read from file: " << std::endl << data << std::endl;

    return 0;
}

总结

  1. 文件同步的需求:介绍了为什么在多进程环境下进行文件同步是必要且常见的需求。涵盖了并发读写文件可能导致的数据错误和一致性问题。

  2. flock命令的基本用法:详细介绍了flock命令的语法和常用参数,以及在Shell脚本或程序中如何使用flock命令来加锁和解锁文件。

  3. 使用flock实现文件同步:给出了使用flock命令实现多个进程之间无缝文件同步的具体步骤和代码示例。重点强调了获取和释放文件锁的原则和正确姿势,以避免死锁和竞争条件。

  4. 锁的类型和作用域:解释了flock命令提供的不同类型和作用域的文件锁,包括共享锁和排他锁等。讨论了在不同场景下选择合适的锁类型的考虑因素。

  5. 其他文件同步方法的比较:简要对比了flock命令与其他常用文件同步方法,如fcntl、pthread等。分析了各种方法的优缺点和适用范围。

  6. 最佳实践和注意事项:总结了使用flock命令进行文件同步时应遵循的最佳实践和注意事项。包括合理设计文件锁的粒度、正确处理异常情况、注意锁的释放时机等。

在这里插入图片描述

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

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

相关文章

Sestra 实用教程(二)方程求解器

目 录 一、前言二、超单元分析三、惯性释放四、模态叠加法4.1 Eigenvalue solvers4.2 Static back substitution 五、模态综合法六、Master-Slave七、参考文献 一、前言 SESAM &#xff08;Super Element Structure Analysis Module&#xff09;是由挪威船级社&#xff08;DNV-…

QMediaPlayer播放视频

简介 使用QT的QMediaPlayer类播放MP4格式的视频。 代码示例 头文件 Ui::MainWindow *ui; QMediaPlaylist *playlist; QMediaPlayer *player; QVideoWidget *videoWidget;方式一 应用窗体外播放视频。 .cpp文件 playlist new QMediaPlaylist;playlist->addMedia(QUrl(…

ShardingSphere-Proxy垂直分片详解与实战

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

python:图片修改尺寸和裁剪

作者:CSDN @ _养乐多_ 本文记录了使用python语言的PIL库对jpg格式的图像进行修改尺寸,按指定像素间隔裁剪的代码。 文章目录 一、修改图片尺寸二、按照指定像素裁剪图片2.1 将小块保存在本地2.2 将小块以一定间隔生成新的图片原图: 一、修改图片尺寸 修改尺寸后, from PI…

c++学习(布隆过滤器)[23]

布隆 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否可能存在于一个集合中。它使用多个哈希函数和位图来表示集合中的元素。 布隆过滤器的基本原理如下&#xff1a; 初始化&#xff1a;创建一个长度为m的位图&#xf…

ARM 详解

一、ARM 的发展史 ARM 的发展历史可以追溯到 1978 年&#xff0c;当年克里斯库里&#xff08;Chris Currry&#xff09;所任职的公司遭遇财务危机&#xff0c;发展每况愈下&#xff0c;库里在和创始人深入沟通后&#xff0c;决定离职。当时的库里对微型计算机很感兴趣&#xf…

大致了解Redis

为了保证数据的可靠性&#xff0c;Redis 需要在磁盘上读写 AOF 和 RDB&#xff0c;但在高并发场景里&#xff0c;这就会直接带来两个新问题&#xff1a;一个是写 AOF 和RDB 会造成 Redis 性能抖动&#xff0c;另一个是 Redis 集群数据同步和实例恢复时&#xff0c;读 RDB 比较慢…

什么是EPC?

文章目录 一、什么是EPC&#xff1f;二、EPC的优势和特征2.1、EPC的优势2.2、EPC的特征 三、EPC项目管理平台3.1、平台简介3.2、平台优势3.3、平台功能模块 一、什么是EPC&#xff1f; EPC&#xff08;Engineering Procurement Construction&#xff09;是指公司受业主委托&am…

MySQL中锁的简介——表级锁-元数据锁、意向锁

1.元数据锁 查看元数据锁 select object_type,object_scheme,object_name,lock_type,lock_duration from perfomance_scheme.metadata_locks;2.意向锁 线程A开启事务后在执行update更新语句时候&#xff0c;会给数据加上行锁&#xff0c;加上行锁以后&#xff0c;会对整张表加…

JMM是如何保证原子性呢?

3.3.1加锁 锁是一种通用技术&#xff0c;比如Java提供的Synchronized关键字就是锁的一种实现&#xff0c;Synchronized是排他锁/独占锁&#xff0c;就是有你没我的意思&#xff0c;只要其他线程到来访问&#xff0c;发现锁还未释放&#xff0c;就要在外面等待&#xff0c;因为S…

【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Docker 入门终极指南[详细]

前言 富 Web 时代&#xff0c;应用变得越来越强大&#xff0c;与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可&#xff0c;而容器化则成为中间的必要桥梁。 本节我们就来探索一下 Docker 的神秘世界&#xff0c;从零到一掌握 Docker 的基本原理与实…

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯&#xff0c;直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容&#xff0c;它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

Java8使用CompletableFuture实现多异步任务同步等待结果

一、应用场景 在实际的开发工作中&#xff0c;我们可能会遇到一些比较复杂且耗时的功能&#xff0c;例如一个业务数据表格的导出&#xff0c;假定业务数据表本身都很大&#xff0c;需要组装的数据又比较多&#xff0c;就会造成整个实现过程很耗时甚至可能出现接口请求超时&…

Android 之 MediaPlayer 播放音频与视频

本节引言&#xff1a; 本节带来的是Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码 和播放音视频。它支持三种不同的…

Carla教程三:参考线平滑理论完全解析(二次规划)

参考线平滑理论 决策规划流程第一步是参考线的生成&#xff0c;然后将障碍物进行投影到以参考线为坐标轴的frenet坐标系。参考线是很关键的一部&#xff0c;解决了导航路径过长&#xff0c;不平滑&#xff0c;不利于坐标转换找匹配点的问题。利用参考线&#xff0c;每一个规划…

LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

适用于 Windows 10/11 的 10 款最佳免费 PDF 阅读器软件

PDF 文档非常受欢迎&#xff0c;因为它们可以在任何操作系统上打开&#xff0c;并且很容易附加到电子邮件、消息或网站中。PDF 文档还具有不易更改的优点。因此&#xff0c;它被个人和组织广泛用于简历、学习材料、文档以及外围设备和设备手册的数字副本。 PDF 阅读器软件可帮…

【JavaEE初阶】Servlet (三)MessageWall

在我们之前博客中写到的留言墙页面,有很严重的问题:(留言墙博客) 如果刷新页面/关闭页面重开,之前输入的消息就不见了.如果一个机器上输入了数据,第二个机器上是看不到的. 针对以上问题,我们的解决思如如下: 让服务器来存储用户提交的数据,由服务器保存. 当有新的浏览器打开页…

Python 基础(十七):库

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬 文章目录 一、Python库的概念二、常用标准库2.1、数字和数学2.2、文件和目录操作2.3、时间和日期2.4、网络通信2.5、并发和多线程2.6、数据压缩和归档2.7、数据序列化…