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

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

一、引言

对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加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 单线程

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个线程,代码如下:

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输出的时候,经常需要新启一个线程,用于一个字符一个字符的处理,像打字机一样按顺序输出每个字符。

    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用法进行阐述,分别举了一个单线程、一个多线程和一个大模型输出流式内容的范例。希望可以帮到您。

目录
相关文章
|
6天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
13天前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
21 3
|
16天前
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
32 3
|
1月前
|
Python
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
5-5|python开启多线程入口必须在main,从python线程(而不是main线程)启动pyQt线程有什么坏处?...
|
1月前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
51 3
|
9天前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
31 0
|
2月前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
18天前
|
安全 Java 数据库连接
Python多线程编程:竞争问题的解析与应对策略
Python多线程编程:竞争问题的解析与应对策略
12 0
|
18天前
|
设计模式 监控 安全
Python多线程编程:特性、挑战与最佳实践
Python多线程编程:特性、挑战与最佳实践
23 0
|
18天前
|
安全 Java 数据库连接
Python多线程编程:竞争问题的解析与应对策略【2】
Python多线程编程:竞争问题的解析与应对策略【2】
12 0