首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏程序员奇点

    Go

    Goroutine 是 Golang 提供的一种轻量级线程,我们通常称之为「」,相比较线程,创建一个的成本是很低的。所以你会经常看到 Golang 开发的应用出现上千个并发的场景。 高并发场景下,会启动大量进行业务处理,此时如果使用可以复用对象,减少池内存分配的效率与创建点创建开销,提高的执行效率。 字节官方开源了gopkg库提供的 gopool 实现。 实现原理 线程设计 type pool struct { // pool 的名字,打 metrics 和打 log 时用到 name string // pool 的容量,也就是最大的真正在工作的 goroutine需不需要加的问题; // 以及是不是啥都没有的问题 // 满足以下两个条件: // 1. task 数量大于阈值 // 2.

    1K20编辑于 2023-03-01
  • 来自专栏流浪猫的golang

    Golang实现

    go实现轻量但并不是越多越好。 使用可用对资源进行有效控制。 在内存资源够用的情况,或者其他不用限制同时任务数的情况,请用原生go ,不必使用 的数量和CPU核数的关系 小于或者等于CPU核数: 适用于计算密集型的任务中,如果的执行时间较长且没有 IO操作,可以将的数量设置为小于CPU核数的值。 这样做可以避免过多的竞争CPU资源,减少上下文切换的开销,如图像处理、数据分析等。 大于CPU核数: 如果任务需要进行大量的IO操作,可以考虑将的数量设置为大于CPU核数的值。

    58410编辑于 2023-10-14
  • 来自专栏思考与总结

    Golang实现

    通过无缓冲的通道实现Worker,无缓冲的通道好处是:1. 任务不会丢失,所有投递的任务都一定会被处理,如果池里的都在忙碌中的话,那么会阻塞在往通道投递任务的那一行代码。2. 调用者可以及时的知道是否处于忙碌的状态中。 type Pool struct {work chan Workerwg sync.WaitGroup}// New创建一个新func New(maxGoroutines int) *Pool { waitgroup中关闭defer p.wg.Done()for w := range p.work {// 阻塞等待执行任务w.Task()}}()}return &p}// Run提交工作到func :package mainimport ("GoPratice/work""log""sync""time")// 通过main.go调用work包中的// 这个示例程序展示如何使用work包//

    90310编辑于 2022-12-18
  • 来自专栏图解系列

    golang 实现

    相比线程,占据更小的内存空间,并且由于是在用户态进行调度,上下文切换的代价更小。所以更加容易支撑几万几百万的并发。 因此本文的目的是学习如何实现一个go。 借鉴java的线程,定义如下的结构体 type GoroutinePool struct { name string coreSize uint32 //定义有多少 taskChan chan func() //类似java的Runable中的run方法 stop bool //是否停止 } 新建一个,通过start方法启动。 但是本文实现的还缺少了: 1、大小的动态扩展能力;例如java支持coreSzie和maxSize,允许一定的突发。 2、拒绝策略。

    37720编辑于 2024-01-25
  • 来自专栏C/C++基础

    白话 Golang

    文章目录 1.何为并发 2.并发的好处 3.Go 如何并发 4.G-P-M 调度模型 5.Go 的代价 6.的作用 7.简易的设计&实现 8.开源的使用 9.小结 参考文献 1.何为并发 6.的作用 无休止地创建大量 goroutine,势必会因为对大量 go 的创建、调度和销毁带来性能损耗。 为了解决这个问题,可以引入。 使用限制 Go 的开辟个数在大型并发场景是有必要的,这也是性能优化方法中对象复用思想的一个具体应用。 7.简易的设计&实现 一个简单的可以这么设计。 8.开源的使用 一个成熟的应该具有如下能力: (1)worker & pool 状态控制; 性能测试、任务超时等都需要知道和控制任务与 Go 的状态。 [5] 博客园.go runtime.Gosched()的作用分析 [6] 书栈网.GC 的认识 [7] Go 语言高性能编程.控制(goroutine)的并发数量

    2.2K20发布于 2021-05-18
  • 来自专栏Bennyhuo

    破解 Kotlin (5) - 取消篇

    关键词:Kotlin 取消 任务停止 的任务的取消需要靠内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。 父。 4.2 如何正确的将回调转换为 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建呢? 5. 小结 这篇文章我们从线程中断的概念切入,类比学习的取消,实际上大家就会发现这二者从逻辑上和场景上有多么的相似。 接着我们将之前我们一直提到的回调转的例子进一步升级,支持取消,这样大家就可以轻易的将回调转变为的挂起调用了。 最后我们还分析了一下 Retrofit 的扩展的一些问题和解决方法,这个例子也进一步可以引发我们对作用域以及如何将现有程序化的思考。

    2.3K50发布于 2020-02-20
  • 来自专栏FunTester

    Go语言实现

    之前已经使用了Java实现,最近在计划使用Go语言实现一些新的压测功能的开发,这其中肯定也少不了使用到线程(Go中)。 (Go也没有设计这俩) 下面就要祭出个人原创画作: 这里我借鉴了 动态修改coreThread线程拓展的思路,不再依靠任务队列是否已满来作为增加线程线程数的依据。 属性设计 我从Java抄来两个属性:核心数,最大数。其中核心数在自己管理中收到最大值的限制,在使用API时不受限制。 我增加了活跃数(这个在java.util.concurrent.ThreadPoolExecutor也有,但未显式展示),状态(防止main结束导致进程直接结束)。 1了,自增策略生效了。

    44130编辑于 2023-08-04
  • 来自专栏python、mysql、go知识点积累

    Event事件、进程与线程

    把返回的数据,交给parse_detail(回调函数) pool.submit(get_page,detail_url).add_done_callback(parse_detail) 对比一下: ​ 进程:资源单位 ​ 线程:执行单位 ​ :在单线程下实现并发 注意:不是操作系统资源,它是程序员起的名字,目的是为让单线程能实现并发。 的目的:通过手动模拟操作系统“多道技术”,实现切换+保存状态。 ​ 如何实现? 切换 gevent模块 ​ Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级

    1.1K20发布于 2019-12-16
  • 来自专栏python3

    进程、线程、回调函数、

    摘要: 进程与线程 同步调用和异步调用 回调函数 一、进程与线程: 1、的概念:   不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源。    (通过单线程实现并发) 我们知道,多个线程执行任务时候,如果其中一个任务遇到IO,操作系统会有一种来回'切'的机制,来最大效率利用cpu的使用效率,从而实现多线程并发效果 而:就是用单线程实现并发, IO),这里注意区分操作系统的切换+保存状态是针对多个线程而言,而我们现在是想在单个线程下自己手动实现操作系统的切换+保存状态的功能 注意这个概念完全是程序员自己想出来的东西,它对于操作系统来说根本不存在 这两者肯定都会有IO,如果能够实现通信io了我就去干建连接,建连接io了我就去干通信,那其实我们就可以实现单线程下实现并发 将单个线程的效率提升到最高,多进程下开多线程,多线程下用>>> 实现高并发 实现服务端客户端通信 # 服务端: from gevent import monkey;monkey.patch_all() from gevent import spawn import socket

    72410发布于 2020-01-15
  • 来自专栏程序员奇点

    字节开源Go gopool

    字节开源Gogopool Java 中线程,也支持自定义线程,为啥 Golang 官方没有提供的实现?Golang 官方偏向轻量级的并发, 希望通过 go func() 解决问题。 泄漏问题,如果的bug,导致无法被回收,日积月累,可能导致程序崩溃,需要有工具避免泄漏问题。 先写一个 一般来说,用 waitGroup 结合 channel ,可以实现一个的功能。 一个,一般要具有如下三个功能: 提交任务 启动 等待执行结束 package main import ( "fmt" "sync" "testing" ) // ,设置工作协数量为 5 pool := NewPool(5) // 提交任务到 for i := 1; i < 5; i++ { task := Task

    3.6K10编辑于 2024-04-17
  • 来自专栏程序技术知识

    golang 好用的推荐

    golang开源的项目:github.com/gammazero/workerpool下面是一段使用 demopackage main import ( "fmt" "github.com

    69430编辑于 2022-07-08
  • 来自专栏活动

    Go语言的实现

    的优势通过限制并发任务的数量,可以有效控制资源使用,提升系统性能,主要优势包括:资源管理:通过限制goroutine的数量,避免资源过度消耗。 的实现一个简单的需要以下几个部分:任务队列:存放待执行的任务。工人(worker):负责执行任务的goroutine集合。调度器:管理任务队列和工人之间的交互。 分布式在大规模分布式系统中,可以将扩展到多台机器,通过分布式消息队列协调任务调度,实现高可用、高性能的分布式任务处理。 通过引入分布式,可以将任务分发到多台机器上进行处理,提高系统的处理能力和可用性。分布式任务队列是实现分布式的关键。它负责将任务分发到不同的机器上,并收集处理结果。 每个节点运行一个本地,并从分布式任务队列中获取任务进行处理。通过负载均衡算法,确保任务均匀分布到各个节点上,提高系统整体性能。

    39300编辑于 2024-07-06
  • 来自专栏运维开发王义杰

    用设计模式包装

    是一种常见的并发编程模式,它可以在多个协程之间共享一组固定数量的,以避免创建过多的导致系统资源耗尽。 在 Go 语言中,通常使用 sync.WaitGroup 和 chan 类型来实现。 在本文中,我们将介绍一种用户设计模式,即封装。 该模式可以将的实现细节隐藏在一个简单的接口后面,使用户可以轻松地使用而不必了解其内部实现。 实现 首先,我们定义一个 workerFunc 类型,它表示一个可以在池中运行的函数。 workers 通道用于存储要运行的函数,limit 通道用于限制池中的数量。 在函数运行完成后,我们调用 Stop 方法来关闭。 通过封装,我们可以将的实现细节隐藏在一个简单的接口后面,使用户可以轻松地使用而不必了解其内部实现。

    36010编辑于 2023-08-10
  • 来自专栏Golang语言社区

    fasthttp中的实现

    fasthttp中的实现 可以控制并行度,复用。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了。 在 g1 中运行着呢。 本文来自:Segmentfault 感谢作者:一堆好人卡 查看原文:fasthttp中的实现

    2.1K90发布于 2018-03-26
  • 来自专栏一起学Golang

    Golang并发模型:轻松入门

    对于A,我们可以来1个开一个goroutine去处理,对于B,我们可以使用一个池里有5个线程去处理B类任务,这样B消耗的资源就不会太多。 控制使用资源并不是目的,使用是为了更好并发、程序鲁棒性、容错性等。废话少说,快速入门才是这篇文章的目的。 简单模型 上面这个图展示了最简单的的样子。 至于池中,有多少处理任务,这是外部不关心的。 看一下池内部,图中画了5个goroutine,实际goroutine的数量是依具体情况而定的。 示例代码2 main()启动genJob获取存放任务的通道jobCh,然后创建retCh,它的缓存空间是200,并使用workerPool启动一个有5

    55030发布于 2019-04-11
  • 来自专栏AndrekzWu的专栏

    Go系列-构建高性能

    errors.New("input thread nums more than Max nums")// HandleEvent 处理事件type HandleEvent func()// ThreadInfo 结构定义 type ThreadInfo struct {f HandleEventsem chan intno int}// ThreadPool 定义type ThreadPool struct {threadnums int // 携数量threadChans chan int // 程控制器mx sync.Mutex // 保护锁threadInfos []*ThreadInfo // 携信息queuesmx sync.Mutex // 事件队列锁queues millsecondcancel context.CancelFunc // 程控制上下文函数isover bool // 是否结束}//

    61221编辑于 2022-09-21
  • 来自专栏硬核项目经理的专栏

    【Swoole系列4.6】连接

    连接 连接这个东西即使没用过,你也应该听说过,特别是做过 Java 等其它语言开发的同学,对这玩意绝对不会陌生。今天,我们就来讲讲 Swoole 中如何应用连接。 Swoole 中的连接,是基于的,并且也是通过 Channel 自动调度的,你不用管太多别的,只管用就是了。 连接对象准备好之后,创建 4 个协,在这些中使用连接去请求 MySQL 查询,当然,并没有查询什么真的表,只是做一个简单的计算操作,如果执行或计算失败,会抛出异常。 这就是连接的作用,我们不必重复地创建连接对象,节省建立连接的时间。由于我们的数量比较小,看不出什么效果,大家可以加大数量,比如我们将 $i 改为 1024 。 然后你也可以自己再调大创建的数量以及调整连接数据进行测试。 连接设置多大 连接的数量可不是随便设置的,第一点,你不能超过对方系统所支持的连接数量。

    93720编辑于 2023-03-03
  • 来自专栏changxin7

    5.并发编程

    一句话说明什么是线程:是一种用户态的轻量级线程,即是由用户程序自己控制调度的。 指的是单个线程,因而一旦出现阻塞,将会阻塞整个线程   总结特点: 必须在只有一个单线程里实现并发 修改共享数据不需加锁 用户程序里自己保存多个控制流的上下文栈 附加:一个遇到IO操作自动切换到其它 上面这个图,是真正的意义,虽然没有规避固有的I/O时间,但是我们使用这个时间来做别的事情了,一般在工作中我们都是进程+线程+的方式来实现并发,以达到最好的并发效果,如果是4核的cpu,一般起5个进程 ,每个进程中20个线程(5倍cpu数量),每个线程可以起500个,大规模爬取页面的时候,等待网络延迟的时间的时候,我们就可以用去实现并发。 #用法 g1=gevent.spawn(func,1,2,3,x=4,y=5)创建一个对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数

    57510发布于 2019-09-10
  • 来自专栏开源技术小栈

    篇〡workerman 5.x 上下文 Context

    是一种比线程更轻量级的用户级并发机制,能够在进程中实现多任务调度。它通过手动控制挂起和恢复来实现间的切换,避免了进程上下文切换的开销。 event-loop Swoole或者Swow驱动可以实现PHP阻塞函数自动化,从而实现原来的同步代码异步执行 但Fiber无法像Swoole和Swow那样自动化,遇到PHP自带的阻塞函数时会阻塞整个进程 ,并不会发生切换 当使用Swoole Swow Fiber驱动时,workerman每次运行onWorkerStart onMessage onConnect onClose等回调时会自动创建一个来执行 引入后产生了创建、调度、销毁、连接等额外开销。通过大量压测数据来看,在充分利用CPU的情况下,引入后极限性能比阻塞式IO下降约10%-20%。 Context 上下文 Context用于在中存储和传递上下文信息,例如数据库连接、用户信息等。每个协有自己的上下文,不同程之间的上下文是隔离的。

    41010编辑于 2025-02-08
  • 来自专栏飞鸟的专栏

    十、python学习笔记--爬虫(对比和非效率)

    # 一个简单的小爬虫,将3个页面的数据保存到data.html,对比和非的使用时间 """ 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过gevent.joinal执行 (会在IO阻塞处切换),用时短 4、在Windows系统,由于捕获IO较慢。

    1K31编辑于 2022-02-10
领券