POD内的容器之间的资源共享

news2024/11/15 1:27:36

概述

摘要:本文通过实践描述并验证了pod内容器如何实现网络、文件、PID、UTC、mount的共享。

pod实战之容器内资源共享与隔离

container容器之间的共享实战

从实际场景说起:有2个容器nginx与wordpress分别运行了紧密耦合且需要共享资源的应用程序。我们希望2两个容器共享网络命名空间,IPC 命名空间,PID 命名空间。

实现这个需求的可以使用2个解决方案:

解决方案一

  1. 先创建一个名为nginx的业务容器,根据docker的底层原理,linux内核中的namespaces组件会为nginx的容器创建独立与宿主的网络、IPC、PID、UTC命名空间。
  2. 再创建业务容器wordpress,同时将wordpress“加入”,属于nginx容器的命名空间。

在这里插入图片描述

该方案实现简单,但是存在一个问题就是,wordpress容器依赖nginx业务容器,一旦nginx容器fail,wordpress容器也将fail.

解决方案二

在这里插入图片描述

为了解决方案一存在的问题,我们可以利用pause容器来解决。pause容器不执行任何业务逻辑,仅仅是为了创建一个独立的命名空间而生,之后再将业务容器
“加入”到pause容器已经创建的命名空。具体步骤如下:

  1. 先创建一个容器:pause的容器,根据docker的底层原理,linux内核中的namespaces组件会为pause的容器创建独立于宿主的网络、IPC、PID、UTC命名空间。pause是一个特殊的容器,里面运行着一个非常简单的进程,它不执行任何功能,基本上是永远“睡觉”的。
  2. 创建业务容器nginx,同时将nginx”加入“,属于pause容器的命名空间。
  3. 再创建业务容器wordpress,同时将wordpress”加入“,属于pause容器的命名空间。

解决方案二的实践

root@ ubuntu1604:~# docker run -d --name pause   pause:3.1
3fd25a34f1b92e3799bbef61b13f88258ea9633b1ffef512e8e7d2f6b5fc199a

root@ ubuntu1604:~# docker  ps |grep pause
3fd25a34f1b9         pause:3.1   "/pause"                 26 seconds ago      Up 25 seconds                           pause
  • –name:指定 pause 容器的名字,pause
root@ ubuntu1604:~# docker run -d --name nginx --net=container:pause --ipc=container:pause --pid=container:pause --ipc=shareable   ubuntu1604
3d043d9a692cb8e3ed1e7f522c8222cc99d0e0c1a44b8b2ca0c4083c308f073f

root@ ubuntu1604:~# docker ps |grep nginx
3d043d9a692c         ubuntu1604   "/start.sh"              25 seconds ago      Up 24 seconds                           nginx
  • –net=container:pause:表示创建的容器与另一个容器共享网络命名空间。在这种情况下,容器 “nginx” 会与名为 “pause” 的容器共享网络命名空间,它们可以使用相同的网络配置和接口。
  • –ipc=container:pause:表示创建的容器与另一个容器共享 IPC 命名空间。IPC 命名空间允许容器之间进行进程间通信(Inter-Process Communication),在这里,容器 “nginx” 与名为 “pause” 的容器共享 IPC 命名空间。
  • –pid=container:pause:表示创建的容器与另一个容器共享 PID 命名空间。PID 命名空间允许容器查看和管理其他容器的进程。
  • –ipc=shareable:指示 IPC 命名空间是可共享的,以便其他容器也可以加入到这个共享命名空间中。
root@ ubuntu1604:~# docker run -d --name wordpress --net=container:pause --ipc=container:pause --pid=container:pause --ipc=shareable  ubuntu16.04
efaedd09438fdc2eb903cc2b57301088abf6cd6ee35fcc37f8d0b341802c28b5

  • 查看网络命名空间是否共享
root@ ubuntu1604:~# docker exec -it nginx  /bin/bash
root@3fd25a34f1b9:/work# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
root@3fd25a34f1b9:/work# ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.2


root@ ubuntu1604:~# docker exec -it wordpress  /bin/bash
root@3fd25a34f1b9:/work# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:c0:a8:01:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
root@3fd25a34f1b9:/work# ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.2

可以看到nginx与wordpress两个容器,IP地址和路由表是一样的,说明它们共用一个网络协议栈(网络命名空间)。

  • 查看PID命名空间是否共享
root@ ubuntu1604:~# docker exec -it nginx  ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0   1024     4 ?        Ss   17:26   0:00 /pause
root          6  0.0  0.0  19696  3160 ?        Ss   17:28   0:00 /bin/bash /sta
root         25  0.0  0.0  65512  3128 ?        Ss   17:28   0:00 /usr/sbin/sshd
root         34  0.0  0.0  27728  2748 ?        Ss   17:28   0:00 /usr/sbin/cron
root         39  0.0  0.0   6008   664 ?        S    17:28   0:00 sleep 600
root         40  0.0  0.0  19696  3368 ?        Ss   17:29   0:00 /bin/bash /sta
root         68  0.0  0.0  27728  2620 ?        Ss   17:29   0:00 /usr/sbin/cron
root         73  0.0  0.0   6008   668 ?        S    17:29   0:00 sleep 600
root        126  0.0  0.0  36084  3224 pts/0    Rs+  17:34   0:00 ps aux

root@ ubuntu1604:~# docker exec -it wordpress  ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0   1024     4 ?        Ss   17:26   0:00 /pause
root          6  0.0  0.0  19696  3160 ?        Ss   17:28   0:00 /bin/bash /sta
root         25  0.0  0.0  65512  3128 ?        Ss   17:28   0:00 /usr/sbin/sshd
root         34  0.0  0.0  27728  2748 ?        Ss   17:28   0:00 /usr/sbin/cron
root         39  0.0  0.0   6008   664 ?        S    17:28   0:00 sleep 600
root         40  0.0  0.0  19696  3368 ?        Ss   17:29   0:00 /bin/bash /sta
root         68  0.0  0.0  27728  2620 ?        Ss   17:29   0:00 /usr/sbin/cron
root         73  0.0  0.0   6008   668 ?        S    17:29   0:00 sleep 600
root        121  0.0  0.0  36084  3208 pts/0    Rs+  17:33   0:00 ps aux


可以看到nginx与wordpress两个容器,可以相互看到多方的进程pid。

  • 查看文件系统挂载是否共享
root@ ubuntu1604:~# docker exec -it nginx  df
Filesystem     1K-blocks     Used Available Use% Mounted on
overlay        309505024 38063364 258331752  13% /
tmpfs              65536        0     65536   0% /dev
tmpfs           16336452        0  16336452   0% /sys/fs/cgroup
/dev/vda1      309505024 38063364 258331752  13% /etc/hosts
shm                65536        0     65536   0% /dev/shm
tmpfs           16336452        0  16336452   0% /proc/acpi
tmpfs           16336452        0  16336452   0% /proc/scsi
tmpfs           16336452        0  16336452   0% /sys/firmware

root@ ubuntu1604:~# docker exec -it wordpress  df
Filesystem     1K-blocks     Used Available Use% Mounted on
overlay        309505024 38063460 258331656  13% /
tmpfs              65536        0     65536   0% /dev
tmpfs           16336452        0  16336452   0% /sys/fs/cgroup
/dev/vda1      309505024 38063460 258331656  13% /etc/hosts
shm                65536        0     65536   0% /dev/shm
tmpfs           16336452        0  16336452   0% /proc/acpi
tmpfs           16336452        0  16336452   0% /proc/scsi
tmpfs           16336452        0  16336452   0% /sys/firmware

可以看到nginx与wordpress两个容器,挂载的目录是一样的。

  • 查看UTC命名空间是否共享
root@ ubuntu1604:~# docker exec -it wordpress  hostname
3fd25a34f1b9
root@ ubuntu1604:~# docker exec -it nginx  hostname
3fd25a34f1b9

可以看到nginx与wordpress两个容器,挂载的主机名是一样的。

总结:

  • 方案二中,由于pause是不运行业务逻辑代码,永远处于”睡觉“状态。就可以"维护"一套独立的命名空间,再将业务容器加入pause的命名空间。

  • 细心的读者可能观察到,这套方案和pod就很类似,恩,没错。kubernetes就是利用pause容器+业务容器来实现一个POD的。

  • 其实pause除了实现 Pod 中多个容器的共享网络与资源隔离的功能之外,pause 容器也会负责管理容器之间的生命周期,保证在 Pod 删除与更新时,容器和资源可以被正确地释放。如果 Pod 中运行的所有其他容器都终止,则 pause 容器自动终止并删除。

    关于pause容器的具体描述后面再展开。

pod内容器之间的共享与隔离

我们知道kubernetes管理的最小单位是pod,而不是容器。一个pod中可以包括一个或多个容器。在实践中,通常一个pod中运行多个容器,将多个紧密耦合且需要共享资源的应用程序封装到一个pod.

实践中根据业务场景的不同,需要考虑pod中多个容器对共享与隔离的需求:

  1. pod内的多个容器,使用的网络是共享的,而且也是必须的。
  2. pod内的多个容器,对于文件系统是有共享的需求的,默认情况下容器之间对文件访问是隔离的。
  3. pod内的多个容器,对于pid也是有共享需求的,默认情况下容器的pid是隔离的,不能相关看到对方容器的pid。
  4. pod内的多个容器,对于hostname(UTC)也是有共享需求的,默认情况下容器的UTC是隔离的,容器有不同的hostname。
  5. pod需要和宿主共享PID,默认pod是无法看到宿主的PID,也是处于安全考虑,默认情况下pod无法与宿主共享PID命名空间。

pod内容器之间网络的共享

当Pod创建多个容器时,容器之间会通过namespace实现了隔离的,之间的网络是隔离的。Pod要解决内部容器之间网络通信的问题其实就要打破namespace的隔离。

那么Kubernetes是怎么解决两个容器之间通信的问题呢?

也即是容器之间看到的网络协议栈是一样的,在创建pod的时候会先创建infra container这个容器(也叫sandbox或pause容器),启动好之后然后再将实际创建的容器加入到infra container容器当中,这个infra容器实现的主要目的是维护了pod的网络,没有跑任何的业务逻辑,只是启动了一个容器罢了。其他容器的创建都让其连接至该容器的网络命名空间当中。这样一来其他容器看到的网络视图就是infra container的网络视图了。一个pod当中所有的容器看到的网络设备,网卡,ip,mac地址都看到的是同一个了,因为在一个网络命名空间。这样就解决了网络共享的问题。实际上pod的ip就是infra container的ip。(类似上面方案二的实践)

记住: 同一个pod内的所有容器共享一个协议栈。

pod内容器之间文件的共享

pod内的容器之间的文件系统,默认是相互隔离的。如果需要实现共享文件或目录,可以两个容器共享一个卷用于他们之间的通信。

root@ ubuntu1604:~# cat pod-blog.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: blog
  labels:
    app: blog
spec:
  restartPolicy: Always
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:
  containers:
    - name: nginx
      volumeMounts:
      - name: shared-data
        mountPath: /sharedir
      image: ubuntu16.04
    - name: wordpress
      volumeMounts:
      - name: shared-data
        mountPath: /sharedir
      image: ubuntu16.04

在配置文件中,你可以看到 Pod 有一个共享卷,名为 shared-data

配置文件中的第一个容器运行了一个 nginx 服务器,第二个容器是运行 wordpress 服务器。他们共享卷的挂载路径是 /sharedir

先在第一个容器中共享的目录中创建一个文件/sharedir/blog.txt

root@ ubuntu1604:~# kubectl get pod -owide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
blog   2/2     Running   0          10s   192.168.26.100   10.234.12.77   <none>           <none>
root@ ubuntu1604:~# kubectl exec -it blog -c nginx -- bash
root@blog:/work# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         296G   84G  199G  30% /
tmpfs            64M     0   64M   0% /dev
tmpfs            16G     0   16G   0% /sys/fs/cgroup
/dev/vda1       296G   84G  199G  30% /sharedir
shm              64M     0   64M   0% /dev/shm
tmpfs            16G   12K   16G   1% /run/secrets/kubernetes.io/serviceaccount
root@blog:/work# echo "myblog" >>  /sharedir/blog.txt
root@blog:/work# cat /sharedir/blog.txt
myblog

第二个容器读取/sharedir/blog.txt的内容。

root@ ubuntu1604:~# kubectl exec -it blog -c wordpress -- cat /sharedir/blog.txt
myblog

pod内容器之间的PID的共享

POD内的容器之前,默认的PID是隔离的,无法相互看到或操控。但可以使用 Pod .spec 中的 shareProcessNamespace 字段可以启用进程命名空间共享。shareProcessNamespace的值默认为false,即容器之间不是共享进程命名空间的。调整shareProcessNamespace为true,可以实现容器之间共享进程命名空间

创建POD,指定shareProcessNamespace: true

root@ ubuntu1604:~# cat pod-blog.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: blog
  labels:
    app: blog
spec:
  ### 使用 pod.spec.shareProcessNamespace 控制Pod内容器之间的PID共享。shareProcessNamespace的值默认为false
  shareProcessNamespace: true
  restartPolicy: Always
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:
  containers:
    - name: nginx
      volumeMounts:
      - name: shared-data
        mountPath: /sharedir
      image: ubuntu16.04
    - name: wordpress
      volumeMounts:
      - name: shared-data
        mountPath: /sharedir
      image: ubuntu16.04

观察2个业务容器观察到的PID是一样的。

root@ ubuntu1604:~# kubectl exec -it blog -c nginx --  ps  aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0   1024     4 ?        Ss   18:13   0:00 /pause
root          6  0.0  0.0  19708  3344 ?        Ss   18:13   0:00 /bin/bash /sta
root         25  0.0  0.0  65512  3080 ?        Ss   18:13   0:00 /usr/sbin/sshd
root         34  0.0  0.0  27728  2704 ?        Ss   18:13   0:00 /usr/sbin/cron
root         40  0.0  0.0  19708  3328 ?        Ss   18:13   0:00 /bin/bash /sta
root         68  0.0  0.0  27728  2700 ?        Ss   18:13   0:00 /usr/sbin/cron
root        102  0.0  0.0   6008   800 ?        S    18:23   0:00 sleep 600
root        103  0.0  0.0   6008   660 ?        S    18:23   0:00 sleep 600
root        119  0.0  0.0  36084  3216 pts/0    Rs+  18:28   0:00 ps aux
root@ ubuntu1604:~# kubectl exec -it blog -c wordpress  --  ps  aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0   1024     4 ?        Ss   18:13   0:00 /pause
root          6  0.0  0.0  19708  3344 ?        Ss   18:13   0:00 /bin/bash /sta
root         25  0.0  0.0  65512  3080 ?        Ss   18:13   0:00 /usr/sbin/sshd
root         34  0.0  0.0  27728  2704 ?        Ss   18:13   0:00 /usr/sbin/cron
root         40  0.0  0.0  19708  3328 ?        Ss   18:13   0:00 /bin/bash /sta
root         68  0.0  0.0  27728  2700 ?        Ss   18:13   0:00 /usr/sbin/cron
root        102  0.0  0.0   6008   800 ?        S    18:23   0:00 sleep 600
root        103  0.0  0.0   6008   660 ?        S    18:23   0:00 sleep 600
root        124  0.0  0.0  36084  3152 pts/0    Rs+  18:29   0:00 ps aux

注意:这里有一个隐含的信息,是pause, nginx,wordpress三个容器共享进程命名空间。PID 1是pause容器

pod内容器之间共享主机名

POD内的容器之前,默认的UTC是独立的,也就是容器的主机名都不通。但可以使用 Pod .spec 中的 hostname 实现UTC命名空间共享,也就是多个容器共用同样的主机名。

创建yaml文件pod-blog.yaml,添加spec.hostname: sharedhostname实现容器之间共用同样的主机名


---
apiVersion: v1
kind: Pod
metadata:
  name: blog
  labels:
    app: blog
spec:
  ### 使用 pod.spec.hostname 实现容器共用同一个主机名
  hostname: sharedhostname
  ### 使用 pod.spec.shareProcessNamespace 控制Pod内容器之间的PID共享。shareProcessNamespace的值默认为false
  shareProcessNamespace: true
  restartPolicy: Always
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:
  containers:
    - name: nginx
      volumeMounts:
      - name: shared-data
        mountPath: /sharedir
      image:  ubuntu1604
    - name: wordpress
      volumeMounts:
      - name: shared-data
        mountPath: /sharedir
      image:  ubuntu1604
root@ ubuntu1604:~# kubectl exec -it blog -c nginx -- hostname
sharedhostname
root@ ubuntu1604:~# kubectl exec -it blog -c wordpress  -- hostname
sharedhostname

pod与宿主的共享网络命名空间

我们知道pod如果需要使用宿主的网络协议栈,可以使用hostNetwork: true来实现。 由于该场景非常有,所以本次实践略。

pod与宿主的进程命名空间

我们知道pod如果需要使用宿主的网络协议栈,可以使用hostNetwork: true来实现。 有时场景下一个管理性的Pod,也需要与宿主进程命名空间,即看到和控制宿主的进程。这时就可以使用hostPID: true来实现。

创建yaml文件指定hostPID: true

---
apiVersion: v1
kind: Pod
metadata:
  name: mgr
spec:
  restartPolicy: Always
  hostPID: true
  containers:
    - name: nginx
      image: ubuntu16.04

从容器中查看宿主的内核进程kworker

root@ ubuntu1604:~# kubectl exec -it mgr -- ps aux |grep worker |head
root          4  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/0:0H]
root         18  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/1:0H]
root         24  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/2:0H]
root         30  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/3:0H]
root         36  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/4:0H]
root         42  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/5:0H]
root         48  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/6:0H]
root         54  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/7:0H]
root         60  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/8:0H]
root         66  0.0  0.0      0     0 ?        I<   16:28   0:00 [kworker/9:0H]

参考文档

同 Pod 内的容器使用共享卷通信

在 Pod 中的容器之间共享进程命名空间

https://cloud.tencent.com/developer/article/2332162

https://blog.csdn.net/qq_34556414/article/details/110083541

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

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

相关文章

英语学习交流平台|基于java的英语学习交流平台系统小程序(源码+数据库+文档)

英语学习交流平台系统小程序 目录 基于java的英语学习交流平台系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

基于SpringBoot的校园社团活动管理系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、设计&#xff08;论文&#xff09;研究背景与意义 在当今的社会&#xff0c;可以说是信息技术的发展时代&#xff0c;在社会的方方面面无不涉及到各种信息的处理。[1]信息是人们对客观世界的具体描述&#xff0c;是人们进行…

性能优化一:oracle 锁的原则

文章目录 锁的原则查看具体会话阻塞过程 锁的原则 1、只有被修改时,行才会被锁定。 2、当条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升 3、当某行被修改时 &#xff0c;它将阻塞别人对它的修改。 4、当一个事务修改一行时.将在这个行上加上行锁(TX…

测试开发基础——测试用例的设计

三、测试用例的设计 1. 什么是测试用例 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。 设计测试用例原则一&#xff1a;测试用例中一个必需部分是对预期输出或结果进…

带你如何使用CICD持续集成与持续交付

目录 一、CICD是什么 1.1 持续集成&#xff08;Continuous Integration&#xff09; 1.2 持续部署&#xff08;Continuous Deployment&#xff09; 1.3 持续交付&#xff08;Continuous Delivery&#xff09; 二、git工具使用 2.1 git简介 2.2 git的工作流程 2.3 部署g…

【MRI基础】Partial volume 伪影

基本概念 partial volume 伪影是 MRI 中的一种常见伪影&#xff0c;当图像中的体素包含不同组织类型或结构的混合时就会出现这种伪影。这种伪影是由于成像系统的空间分辨率有限而产生的&#xff0c;导致具有不同信号强度的相邻结构在一个体素内混合在一起。 抑制MRI 中的parti…

图数据库的力量:深入理解与应用 Neo4j

图数据库的力量&#xff1a;深入理解与应用 Neo4j 文章目录 图数据库的力量&#xff1a;深入理解与应用 Neo4j1、什么是 Neo4j&#xff1f;版本说明 2、Neo4j 的部署和安装Neo4j Web 工具介绍 3、体验 Neo4j加载数据查询数据数据结构 4、Cypher 入门创建数据查询数据关系深度查…

Matlab simulink建模与仿真 第十五章(信号源库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号源库中的模块概览 注&#xff1a;部分模块在第二章中有介绍&#xff0c;本章不再赘述。 二、from输入源模块 1、From Workspace模块 &#xff08;1&#xff09;该模块可从MATLAB工作区、模型工作区…

JVM 运行时数据区域

目录 前言 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 前言 首先, java程序在被加载在内存中运行的时候, 会把他自己管理的内存划分为若干个不同的数据区域, 就比如你是一个你是一个快递员, 一堆快递过来需要你分拣, 这个时候, 你就需要根据投放的目…

数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例

时间序列概况在日常生活和专业研究中都很常见。简而言之,时间序列概况是一系列连续的数据点 y(0), y(1), …, y(t) ,其中时间 t 的点依赖于时间 t-1 的前一个点(或更早的时间点)。 在许多应用中,研究者致力于预测时间序列概况的未来行为。存在各种建模方法。这些模型通常基于过…

Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 在本章中&#xff0c;我们开始编写面向用户的界面&#xff0c;其中只涉及简单的HTML结构&#xff0c;不会做太多美化&#xff0c;目的就是把后台创建的数据展示到前台。 从技术上来讲&#xff0c;这一节将涉及Django 中function view和 class-based view 的用…

用Python实现时间序列模型实战——Day 22: LSTM 与 RNN 模型

一、学习内容 1. 长短期记忆网络 (LSTM) 的原理 LSTM&#xff08;长短期记忆网络&#xff09; 是一种专门用于处理时间序列数据的神经网络&#xff0c;它克服了传统 RNN 在处理长序列时出现的梯度消失问题。LSTM 通过引入 记忆单元 和 门控机制&#xff08;输入门、遗忘门、输…

Ruffle 继续在开源软件中支持 Adobe Flash Player

大多数人已经无需考虑对早已寿终正寝的 Adobe Flash 的支持&#xff0c;但对于那些仍有一些 Adobe Flash/SWF 格式的旧资产&#xff0c;或想重温一些基于 Flash 的旧游戏/娱乐项目的人来说&#xff0c;开源 Ruffle 项目仍是 2024 年及以后处理 Flash 的主要竞争者之一。 Ruffl…

【Hot100】LeetCode—4. 寻找两个正序数组的中位数

目录 1- 思路题目识别二分 2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 原题链接&#xff1a;4. 寻找两个正序数组的中位数 1- 思路 题目识别 识别1 &#xff1a;给定两个数组 nums1 和 nums2 &#xff0c;找出数组的中位数 二分 思路 将寻找中位数 —…

Python数据分析案例59——基于图神经网络的反欺诈交易检测(GCN,GAT,GIN)

以前的数据分析案例的文章可以参考&#xff1a;数据分析案例 案例背景 以前二维的表格数据的机器学习模型都做烂了&#xff0c;[线性回归,惩罚回归,K近邻,决策树,随机森林,梯度提升,支持向量机,神经网络]&#xff0c;还有现在常用的XGBoost&#xff0c;lightgbm&#xff0c;ca…

ffmpeg实现视频的合成与分割

视频合成与分割程序使用 作者开发了一款软件&#xff0c;可以实现对视频的合成和分割&#xff0c;界面如下&#xff1a; 播放时&#xff0c;可以选择多个视频源&#xff1b;在选中“保存视频”情况下&#xff0c;会将多个视频源合成一个视频。如果只取一个视频源中一段视频…

keil5进行stm32编程时常遇到的问题和ST-LINK在线仿真的连接问题

本文记录原因 最近一直在尝试usb的自定义键盘、无刷电机和pcb的一些东西&#xff0c;很久没使用stm32编写程序了。在浏览购物网站的时候发现很多便宜的小系统板。 使用小的系统板原因 1&#xff0c;在网上看到板子很便宜&#xff0c;以前很少看见&#xff0c;但现在网上对这…

大数据新视界 --大数据大厂之数据科学项目实战:从问题定义到结果呈现的完整流程

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

uniapp 知识总结

1. uniapp 知识总结 uni-app是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Harmony、Web&#xff08;响应式&#xff09;以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、…

【webpack4系列】设计可维护的webpack4.x+vue构建配置(终极篇)

文章目录 构建配置包设计通过多个配置文件管理不同环境的 webpack 配置抽离成一个 npm 包统一管理&#xff08;省略&#xff09;通过 webpack-merge 组合配置 功能模块设计目录结构设计构建配置插件安装webpack、webpack-cli关联HTML插件html-webpack-plugin解析ES6解析vue、JS…