当前位置: 首页 > news >正文

golang 多线程管理 -- chatGpt

提问:

用golang写一个启动函数 start(n) 和对应的停止函数stopAll(),. start函数功能:启动n个线程,线程循环打印日志,stopAll()函数功能:停止start启动的线程

以下是一个示例的Golang代码,其中包括 `start` 函数用于启动n个线程,这些线程会循环打印日志,并且 `stopAll` 函数用于停止 `start` 启动的线程。

```go 代码
package main

import (
    "fmt"
    "sync"
    "time"
)

// Worker 表示一个工作线程
type Worker struct {
    id      int
    stopCh  chan struct{}
    stopped chan struct{}
}

// NewWorker 创建一个新的工作线程
func NewWorker(id int) *Worker {
    return &Worker{
        id:      id,
        stopCh:  make(chan struct{}),
        stopped: make(chan struct{}),
    }
}

// Start 启动工作线程,开始打印日志
func (w *Worker) Start() {
    go func() {
        defer close(w.stopped)
        for {
            select {
            case <-w.stopCh:
                return
            default:
                fmt.Printf("Worker %d: Logging...\n", w.id)
                time.Sleep(1 * time.Second)
            }
        }
    }()
}

// Stop 停止工作线程
func (w *Worker) Stop() {
    close(w.stopCh)
    <-w.stopped
    fmt.Printf("Worker %d: Stopped.\n", w.id)
}

var (
    workers []*Worker
    wg      sync.WaitGroup
)

// Start 启动n个工作线程
func Start(n int) {
    for i := 0; i < n; i++ {
        worker := NewWorker(i)
        worker.Start()
        workers = append(workers, worker)
    }
    fmt.Printf("Started %d workers.\n", n)
}

// StopAll 停止所有工作线程
func StopAll() {
    for _, worker := range workers {
        worker.Stop()
    }
    fmt.Println("Stopped all workers.")
}

func main() {
    n := 3 // 设置要启动的线程数量
    Start(n)

    // 在这里等待一段时间,以便观察线程的运行
    time.Sleep(5 * time.Second)

    StopAll()
}
```

在这个示例中,我们创建了一个 `Worker` 结构,每个工作线程都有一个独立的 `stopCh` 通道用于停止线程,并且有一个 `stopped` 通道用于表示线程已经停止。 `Start` 函数用于启动n个工作线程,它们会循环打印日志,而 `StopAll` 函数会停止所有工作线程。

http://www.lryc.cn/news/156215.html

相关文章:

  • 【Math】导数、梯度、雅可比矩阵、黑塞矩阵
  • 【C语言】——调试技巧
  • 【Python】pytorch,CUDA是否可用,查看显卡显存剩余容量
  • React16入门到入土
  • 【GPT引领前沿】GPT4技术与AI绘图
  • 【LeetCode】19. 删除链表的倒数第 N 个结点
  • spring boot3.x集成swagger出现Type javax.servlet.http.HttpServletRequest not present
  • 《低代码指南》——智能化低代码开发实践案例
  • 268_C++_字节计算(((bits) + 7) / 8)、字节对齐(((number) + 3) / 4 * 4)
  • JavaWeb知识梳理(后端部分)
  • AI:07-基于卷积神经网络的海洋生物的识别
  • centos7下docker设置新的下载镜像源并调整存放docker下载镜像的仓库位置
  • Gitea--私有git服务器搭建详细教程
  • SOLIDWORKS放样是什么意思?
  • Xcode打包ipa文件,查看app包内文件
  • AJAX学习笔记6 JQuery对AJAX进行封装
  • 阿里云服务器退款规则_退款政策全解析
  • ExpressLRS开源之基本调试数据含义
  • DOM 简介 | 深入了解DOM
  • 机器学习丨2. 线性回归(Linear Regression)
  • python+django企业员工考勤打卡信息管理系统66lgr
  • 【Java Web】论坛帖子添加评论
  • 如何建设一个安全运营中心(SOC)?
  • 如何以Base64形式存储、返回图片数据
  • 【大模型】自动化问答生成:使用GPT-3.5将文档转化为问答对
  • 普通平衡树 Splay
  • 复旦-华盛顿EMBA:走近亿咖通科技,探寻汽车智能化的科创“密码”
  • 学习心得07:C#
  • importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图
  • 国际站阿里云服务器远程桌面密码错误怎么办?苹果手机如何远程登录?