- 博客(79)
- 收藏
- 关注
原创 18 go语言(golang) - 反射(reflect)& 结构体标签
结构体标签的一般形式如下,一个字段可以有多个标签,只需用逗号分隔即可// 这里的`key`是标签的名称,而`value`是与该标签关联的值。Name string `这是个名字标签`
2024-12-05 19:02:02 617
原创 17 go语言(golang) - 错误处理
error使用errors.New或创建简单的文本描述性错误。err1 := errors.New("自定义错误1")err2 := fmt.Errorf("自定义错误2")输出自定义错误1自定义错误2如果需要更复杂或结构化的信息,可以定义自己的类型并实现Error()方法。code intmsg string404,"自定义错误!",输出code:404,msg:自定义错误!{404 自定义错误!
2024-12-02 09:42:22 945
原创 16 go语言(golang) - 并发编程select和workerpool
首先,定义一个WorkerPool最大工作者数(maxWorkers:控制同时运行的 goroutine 的最大数量。任务队列(taskQueue:用于存储待处理任务,通常使用channel来实现。停止信号(stopSignal:一个通道,用于发送停止信号给所有工作者,让它们停止执行。同步机制:如互斥锁(sync.Mutex)或 WaitGroup(),用于同步和等待所有工作者完成。// 池stopSignal chan int // 停止信号,接受到数据时时停止// 保证停止后不能再提交任务。
2024-11-28 18:42:15 1064
原创 15 go语言(golang) - 并发编程goroutine原理及数据安全
Go 的 goroutine 是一种轻量级的线程实现,允许我们在程序中并发地执行函数。与传统的操作系统线程相比,goroutine 更加高效和易于使用。用户态调度:Go 运行时提供了自己的调度器,这意味着 goroutine 的创建和切换是在用户空间完成的,而不需要操作系统内核参与。这使得 goroutine 切换比传统线程更快。M:N 模型:Go 使用 M:N 调度模型,将 M 个 goroutines 映射到 N 个操作系统线程上。这种方式可以有效利用多核 CPU,同时保持每个 OS 线程上的多个并发任
2024-11-26 09:40:46 1171
原创 14 go语言(golang) - 并发编程goroutine和channel
并发编程是指在计算机程序中同时执行多个计算任务的技术。这种编程方式旨在利用多核处理器的计算能力,提高程序的执行效率和响应速度。而Go 语言的并发编程主要依赖于两个核心概念:Goroutine 和 Channel。
2024-11-22 09:49:42 836
原创 13 go语言(golang) - 函数
一个简单的函数定义包括关键字func、函数名、参数列表、返回值列表(可选)以及函数体。func 函数名(参数列表) 返回值类型 {函数体func:用于声明一个新函数。函数名:这是函数的名称。参数列表:表示该函数接的参数。返回值类型:表示该函数返回的结果类型,没有返回时可以省略。函数体:包含了实际执行操作的代码块。
2024-11-18 18:54:57 680
原创 12 go语言(golang) - 数据类型:接口
在 Go 中,接口通过type关键字进行定义,并且包含一组方法签名。在上面的例子中,JDBCUtil是一个接口,它要求任何实现该接口的类型都必须有和方法。
2024-11-13 19:13:49 1070
原创 11 go语言(golang) - 数据类型:结构体
一个结构体由一组字段(field)组成,每个字段都有一个名称和类型。可以通过type关键字来定义一个新的结构体类型。结构体的字段可以是任何类型,包括基本类型、其他结构体、切片、哈希表等。对于包含不可比元素的数据类型,你可以通过自定义方法来实现自己的“相等”逻辑。// Equal 方法用于判断两个 Student 是否“相等”if s1.num!var s1 = Student{1, "小明", func() string { return "x" }}
2024-11-11 18:58:54 755
原创 10 go语言(golang) - 数据类型:哈希表(map)及原理(二)
在 Go 语言中,当 map 的元素数量达到一定阈值时,会触发扩容操作以保持性能。这个过程称为 rehashing,即重新散列所有的键值对到一个更大的哈希表中。
2024-10-31 19:11:16 1288
原创 09 go语言(golang) - 数据类型:哈希表(map)及原理(一)
在Go语言中,map是一种内置的数据结构,用于存储键值对。它类似于其他语言中的字典或哈希表。
2024-10-30 19:06:29 928
原创 07 go语言(golang) - 数据类型:指针 & 单元测试
在Go语言中,指针是一种特殊的,它存储了另一个变量的内存地址。指针对于理解和使用计算机科学中的引用传递非常重要。通过使用指针,你可以直接访问和修改内存地址上的数据,这可以提高程序的效率并允许函数间直接修改传入变量的值。
2024-10-25 18:44:14 1080
原创 04 go语言(golang) - 变量和赋值过程
在Go语言中,变量的定义和初始化是编程的基础部分。Go提供了多种方式来声明和初始化变量,以适应不同的使用场景。
2024-10-17 18:51:04 1136
原创 02 go语言(golang) - 包和模块
包(Package)包是 Go 语言中代码组织的基本单位。一个包可以包含多个.go源文件,这些文件中的代码共享相同的包名。包用于将功能相关的代码组织在一起,并且可以通过导入语句(import)被其他包使用。包提供了一种封装机制,允许开发者将内部实现细节隐藏起来,只暴露出一部分接口(即公开的函数、变量、类型等)。模块(Module)从 Go 1.11 版本开始,Go 引入了模块作为依赖管理和封装的单位,这是对传统包概念的扩展。一个模块通常对应一个项目或库,它包含了一组相关的包。
2024-10-14 18:58:43 911
原创 01 go语言(golang) - 入门
Go(又称为Golang)是由Google开发的一种静态类型、编译型、并发导向的编程语言。它由Robert Griesemer、Rob Pike和Ken Thompson在2007年设计,并于2009年正式对外发布。官网介绍:https://go.dev/doc/effective_go从官网的指南可以了解接下来的大概学习路线,以下是通过kimi总结翻译的几个点:介绍:示例:格式化:命名:控制结构:函数:数据:并发:错误处理:Web服务器示例:每种语言都有核心特征及其设计目标,Java 和 Scala 运行
2024-10-12 18:38:04 974
原创 python 异步编程:协程
yield关键字用于定义一个生成器(generator)函数。生成器是一种特殊的迭代器,它允许你逐个产生值,而不是一次性创建并返回一个包含所有值的列表。使用yield的函数在执行过程中可以多次yield值,每次yield都会返回一个值,并在下一次从该点继续执行。yield是 Python 中实现协程和异步编程的基础,特别是在 Python 3.3 之前,当时的asyncio库依赖于生成器来实现协程。在 Python 3.5 及以后版本中,引入了async和await语法,提供了更高级的异步编程能力,但。
2024-06-08 11:14:25 1159
原创 分布式任务队列系统 celery 进阶
app/task1.py 和 app/task2.py在上述示例中,通过合理的项目结构,将不同功能模块分离开来,使得代码更加清晰易维护。配置文件:定义了Celery的broker和backend设置。定义任务:创建了包含具体业务逻辑的异步函数,并用@task装饰器标记为可被调度执行的task.启动Worker:编写了用于启动celerey worker 的脚本,使其能够从消息队列拉取并执行相应操作.主程序调用:通过导入task 模块中的方法,实现对某些操作发起异步请求.
2024-06-05 19:12:31 780
原创 分布式任务队列系统 celery 原理及入门
在代码中定义 Celery 应用和需要异步执行的任务函数。例如创建# broker 为消息中间件配置,这里用的是redis# backend 为任务执行结果存储,也用的是redis# 通过装饰器指定任务执行单元,即消息接受后的处理函数@app.taskreturn f'
2024-05-31 18:42:23 1449 2
原创 python中的互斥锁、死锁、递归锁
Python中的互斥锁(Mutex,Mutual Exclusion)是一种同步原语,用于防止多个线程同时访问共享资源。在Python中,互斥锁通常是通过threading模块中的Lock类来实现的。
2024-05-29 19:11:50 1222
原创 Flink CDC 原理
Flink CDC(Change Data Capture)是 Apache Flink 提供的一个变更数据捕获工具集。它可以监控数据库的变更,并将这些变更实时地以流的形式提供给下游系统,这些变更包括插入、更新和删除操作。Flink CDC 适用于需要实时数据管道和数据流处理的场景,如实时数据分析、数据仓库更新、缓存同步、ETL 过程、微服务架构中的数据一致性等。
2024-05-14 18:44:31 1151
原创 python中的多进程为什么比多线程常见-全局解释器锁
'counter''counter'从输出结果我们可以看到,在没有适当锁机制保护下,最终计数器值经常会得到正确的0。这是因为在CPython中,由于全局解释器锁(GIL)的存在,任何时候只有一个线程可以执行Python字节码。这意味着即使没有锁,也不会有两个线程同时执行全局变量的递增或递减操作。
2024-04-30 19:06:29 573
原创 python中的进程间通信
在Python中,进程之间默认是不共享内存的。每个进程都有自己独立的内存空间,这意味着在一个进程中对数据的修改不会影响到另一个进程中的同名数据。: Python 的: 进程可以通过读写文件或操作数据库来交换信息。这种方法相对简单但可能受到I/O性能限制。:如队列(Queue)和管道(Pipe),这些也是提供的功能。它们允许将消息从一个进程传递到另一个,虽然严格意义上不是共享内存,但它们是进行数据交换和任务协调非常有效的手段。下面是一个简单示例代码说明,在不使用Value的情况下。
2024-04-25 19:10:58 1507 1
原创 python中的锁
在深入探讨锁的机制之前,让我们通过一个生动的实例来引入这一概念。本文将通过模拟一个简单的车票购买系统,阐释锁在多进程环境中的重要性。
2024-04-24 18:58:16 1058
原创 python中的字典(dict)排序
在Python中,字典(dict)本身是无序的,直到Python 3.7版本,字典在迭代时会保持插入顺序。如果你需要根据键(key)或值(value)对字典中的项进行排序,可以使用内置的sorted()函数,它返回一个排序后的列表。
2024-04-19 19:08:35 2822
原创 python中的守护进程、僵尸进程、孤儿进程
孤儿进程(Orphan Process)是指在Unix-like系统中,父进程在其子进程结束之前退出或终止了,而这些子进程还在运行的情况。当父进程终止后,所有未终止的子进程将被init进程(PID为1的特殊系统进程)接管。守护进程(Daemon Process)是一种在后台运行的特殊类型的进程,它独立于控制终端,并且周期性地执行某种任务或等待处理某些事件。在操作系统中,僵尸进程(Zombie Process)是指已经完成执行(终止)但仍然有一个记录存在进程表中的进程。但是并不会造成真正的僵尸进程的出现。
2024-04-18 19:15:13 1264
原创 python中的并发编程-进程、线程2
在实际编程中,应该尽量确保程序能够处理所有可能导致退出的情况,并在退出前进行必要的清理工作,如保存状态、释放资源等。例如,操作系统可能会实施内存限制,当进程尝试分配超过限制的内存时,操作系统会终止该进程。在多进程程序中,如果父进程结束,子进程可能会成为孤儿进程,并被操作系统接管。多进程的使用过程中, 如果没有正常的结束进程,则可能会产生僵尸进程或孤儿进程的, 我们下一篇再详细探讨。在多进程程序中,如果所有子进程都结束了,父进程可能会随之结束。这些进程会尝试回收子进程的资源,但可能会导致子进程的异常退出。
2024-04-17 19:20:54 1310
原创 python中的设计模式:单例模式
设计模式的确切数量并没有一个统一的标准,因为不同的资料和文献可能会对设计模式的定义和分类有所不同。然而,最常见的设计模式集合是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides这四位作者在他们的著作《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)中提出的23种模式。:提供了对象创建的机制,能够增加已有代码的灵活性和可重用性。
2024-04-16 19:03:30 1340
原创 python中的并发编程-进程、线程
线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。它们在同一个进程内共享内存和资源,这使得线程之间的创建、销毁、通信和数据共享更加高效。线程的上下文切换通常比进程的上下文切换更快,因为线程共享大部分进程资源,如文件描述符、全局变量等,不需要切换完整的内存空间。轻量级:线程的创建、销毁和切换的开销都比进程要小得多,因为线程共享所属进程的资源,不需要独立的地址空间。并发性:在多线程的环境下,多个线程可以并发执行,提高了程序的执行效率和响应速度。共享资源。
2024-04-09 18:41:50 894
原创 python中的pass关键字、断言、解包、__name__ =__main__的使用
在Python中,pass是一个空语句,它不做任何操作,只是用来占位或作为占位符使用。在Python中,有时候需要保持语法完整性,但又不需要执行任何操作,这时可以使用pass语句。以下是pass总之,pass语句在Python中是一个空语句,用于占位或作为占位符使用,使得代码保持语法完整性。
2024-04-08 18:57:49 1053 1
原创 python中的垃圾回收机制
Python中的垃圾回收(Garbage Collection,简称GC)机制是一个自动内存管理过程,它负责在对象不再被使用时释放内存资源。Python的垃圾回收主要依赖于引用计数(Reference Counting)来跟踪和回收不再使用的对象。除了引用计数,Python的垃圾回收器还包括一个循环检测器,用于检测并回收循环引用中涉及的对象。
2024-04-07 18:49:32 979
原创 python中的元类
在Python中,一切皆对象,包括基本数据类型(如整数、字符串)、函数、模块等。每个对象都有一个类型来描述它是什么。类型不仅定义了对象可以进行哪些操作,还规定了对象占用的内存大小以及布局方式。自定义一个元类型主要涉及继承自type并重写其__new__或者__init__方法来控制如何创建或初始化新型态(即新建立一个class)。# 定义一个名为 Meta 的元素, 继承自 type# 这是一个类的类。print('__new__方法,创建一个类!不是实例!类名:', name)
2024-03-29 19:09:57 948
原创 python中的反射
反射(Reflection)是编程语言中的一个特性,它允许程序在运行时检查、调用和修改它自己的结构和行为。这意味着程序可以在运行时访问类型信息,并且能够动态地创建对象、调用方法、访问字段和属性,甚至修改类定义。
2024-03-27 18:56:34 1564
原创 python中的装饰器
前面的面向对象特性文章中提到了一些装饰器,比如@property 、@abstractmethod等,本章就重点讨论介绍一下什么是装饰器,及常用的内置装饰器。
2024-03-25 19:18:02 749
原创 python中的面向对象特性
抽象是将复杂的现实问题简化的过程,它通过创建简化的模型来表示复杂的实体,这个模型只包含对于当前问题重要的信息。在面向对象编程中,抽象通常是通过定义类来实现的,类提供了一种方式来定义抽象数据类型,通过隐藏所有的实现细节,只暴露出有限的接口与外界交互。抽象类是一种不能被实例化的类,它通常用作其他类的基类,定义了一些抽象方法,子类需要实现这些抽象方法。Python通过抽象基类(Abstract Base Classes, ABCs)提供了对抽象的支持。使用abc模块可以创建抽象基类。
2024-03-21 19:17:44 669
原创 python中的类与对象
一个基本的类定义包括关键字class,后面跟着类名和冒号。在其下方缩进的代码块中,可以定义属性(变量)和方法(函数)。要使用一个类,你需要根据该类创建对象。每个对象都会有自己独立的属性集合。def __init__(self, value): # 特殊方法__init__用于初始化对象,构造器# 实例化对象print(obj)# 直接修改对象的属性print(obj)
2024-03-20 19:00:29 1344
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人