前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【python】python指南(一):线程Thread

【python】python指南(一):线程Thread

作者头像
LDG_AGI
发布2024-08-13 16:22:09
890
发布2024-08-13 16:22:09
举报
文章被收录于专栏:人工智能极简应用

一、引言

对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言,实习的时候做一个算法策略后台用的是php,毕业后做策略算法开发,因为要用spark,所以写了scala,后来用基于storm开发实时策略,用的java。至于python,从日常用hive做数据策略用python写udf,到基于tensorflow深度学习框架写python版的模型网络,再到现在实用pytorch做大模型。眼看着在语言纷争中,python的应用越来越广,开一个单独的专栏用于记录python中常用到的技巧,算是做笔记,没事翻出来看看。

本文重点介绍python中的线程调用(Thread)。

二、线程(Thread)

2.1 概述

在Python中,Thread 是 threading 模块中的一个类,用于创建线程。线程是程序执行流的最小单元,允许程序同时执行多个任务。使用 Thread 类可以创建一个新的线程来运行指定的代码。

2.2 单线程

代码语言:javascript
复制
import threading

# 定义一个被线程调用的函数
def my_function():
    print("线程在执行任务...")

# 创建一个线程对象,target 指定线程执行的函数
thread = threading.Thread(target=my_function)

# 启动线程
thread.start()

print("主线程继续执行...")

在这个例子中,my_function 是被新线程调用的函数。通过 thread.start() 启动线程后,它将并发地(在支持并发执行的环境中)与主线程一起执行。注意,由于GIL(全局解释器锁)的存在,在CPython解释器中,多线程并不能实现真正的并行计算,但对于IO密集型任务,多线程仍然可以提高效率。

2.3 多线程

建立三个线程先让第1个线程和第2个线程一起运行,然后关闭第1个线程,启动第3个线程,关闭第2个线程,关闭第3个线程,代码如下:

代码语言:javascript
复制
import threading
import time

def thread_function(name,step):
    print("Thread %s: starting" % name)
    for i in range(step):
        time.sleep(1)
        print("Thread %s: %s" % (name, i))
    print("Thread %s: finishing" % name)

thread1 = threading.Thread(target=thread_function, args=("1",5))
thread2 = threading.Thread(target=thread_function, args=("2",10))
thread3 = threading.Thread(target=thread_function, args=("3",5))

thread1.start()
thread2.start()
thread1.join()
thread3.start()
thread2.join()
thread3.join()

print("Exiting Main Thread")

输出如下:

2.4 大模型应用

大模型在进行流式streamer输出的时候,经常需要新启一个线程,用于一个字符一个字符的处理,像打字机一样按顺序输出每个字符。

代码语言:javascript
复制
    inputs = inputs.to(model.device)
    streamer = TextIteratorStreamer(tokenizer=tokenizer, skip_prompt=True, timeout=60.0, skip_special_tokens=True)
    generation_kwargs = dict(
        input_ids=inputs,
        streamer=streamer,
    )
    thread = Thread(target=model.generate, kwargs=generation_kwargs)
    thread.start()

    for new_text in streamer:
        yield new_text 
  • thread:将model.generate和对应参数单独启动一个线程运行
  • yield:不同于return等待所有内容生成后返回,采用yield用于接收streamer中的new_text内容,每产生一个内容,采用yield返回一个

三、总结

本文对Thread用法进行阐述,分别举了一个单线程、一个多线程和一个大模型输出流式内容的范例。希望可以帮到您。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、引言
  • 二、线程(Thread)
    • 2.1 概述
      • 2.2 单线程
        • 2.3 多线程
          • 2.4 大模型应用
          • 三、总结
          相关产品与服务
          GPU 云服务器
          GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档