优草派 > 问答 > Python

Python多线程threading创建及使用方法解析

作者:danpingd     

多线程是计算机科学中十分重要的概念,它能够使得程序在同一时间内执行多个任务,从而提高程序的运行效率。Python语言内置了多线程模块threading,通过该模块可以很方便地创建和使用多线程。本文将从多个角度分析Python多线程的创建及使用方法。

一、多线程的概念

在单核CPU中,只能同时执行一个任务,当系统需要执行多个任务时,就需要通过时间片轮转的方式来切换任务,从而达到多个任务并发执行的效果。而在多核CPU中,可以同时执行多个任务,并发执行的效果更加明显。多线程就是在同一个进程中创建多个线程,使得这些线程能够并发执行不同的任务。

二、Python中的多线程模块threading

Python中的多线程模块threading提供了创建线程、启动线程、停止线程等一系列操作的方法。下面是一些常用的方法:

1. threading.Thread(target, args, kwargs):创建一个线程对象,其中target为线程执行的函数,args为该函数所需要的参数,kwargs为该函数所需要的关键字参数。

2. thread.start():启动线程。

3. thread.join():等待线程执行完毕。

4. thread.is_alive():判断线程是否在运行。

5. thread.setName():设置线程名称。

6. thread.getName():获取线程名称。

三、Python多线程的创建方法

Python多线程的创建方法有两种,一种是继承threading.Thread类,重写run方法;另一种是通过直接传递函数对象创建线程。下面是两种方法的示例代码:

1. 继承threading.Thread类,重写run方法

```

import threading

class MyThread(threading.Thread):

def __init__(self, threadID, name, counter):

threading.Thread.__init__(self)

self.threadID = threadID

self.name = name

self.counter = counter

def run(self):

print("Starting " + self.name)

print_time(self.name, self.counter, 5)

print("Exiting " + self.name)

def print_time(threadName, delay, counter):

while counter:

time.sleep(delay)

print("%s: %s" % (threadName, time.ctime(time.time())))

counter -= 1

if __name__ == "__main__":

thread1 = MyThread(1, "Thread-1", 1)

thread2 = MyThread(2, "Thread-2", 2)

thread1.start()

thread2.start()

thread1.join()

thread2.join()

print("Exiting Main Thread")

```

2. 通过直接传递函数对象创建线程

```

import threading

import time

def print_time(threadName, delay, counter):

while counter:

time.sleep(delay)

print("%s: %s" % (threadName, time.ctime(time.time())))

counter -= 1

if __name__ == "__main__":

thread1 = threading.Thread(target=print_time, args=("Thread-1", 1, 5))

thread2 = threading.Thread(target=print_time, args=("Thread-2", 2, 5))

thread1.start()

thread2.start()

thread1.join()

thread2.join()

print("Exiting Main Thread")

```

四、Python多线程的使用方法

Python多线程的使用方法主要包括线程同步、线程通信和线程池三个方面。

1. 线程同步

线程同步是指多个线程在执行过程中,需要协调彼此的工作,以保证数据的正确性和一致性。Python中多线程同步可以通过锁机制来实现。下面是一个简单的示例:

```

import threading

class MyThread(threading.Thread):

def __init__(self, threadID, name, counter, lock):

threading.Thread.__init__(self)

self.threadID = threadID

self.name = name

self.counter = counter

self.lock = lock

def run(self):

print("Starting " + self.name)

self.lock.acquire()

print_time(self.name, self.counter, 5)

self.lock.release()

print("Exiting " + self.name)

def print_time(threadName, delay, counter):

while counter:

time.sleep(delay)

print("%s: %s" % (threadName, time.ctime(time.time())))

counter -= 1

if __name__ == "__main__":

lock = threading.Lock()

threads = []

thread1 = MyThread(1, "Thread-1", 1, lock)

thread2 = MyThread(2, "Thread-2", 2, lock)

threads.append(thread1)

threads.append(thread2)

for t in threads:

t.start()

for t in threads:

t.join()

print("Exiting Main Thread")

```

2. 线程通信

线程通信是指多个线程之间需要共享数据,因此需要进行数据传输。Python中多线程通信可以通过Queue队列来实现。下面是一个简单的示例:

```

import threading

import queue

class MyThread(threading.Thread):

def __init__(self, threadID, name, queue):

threading.Thread.__init__(self)

self.threadID = threadID

self.name = name

self.queue = queue

def run(self):

print("Starting " + self.name)

process_data(self.name, self.queue)

print("Exiting " + self.name)

def process_data(threadName, queue):

while True:

data = queue.get()

if data == "exit":

break

print("%s processing %s" % (threadName, data))

if __name__ == "__main__":

queue = queue.Queue()

threads = []

thread1 = MyThread(1, "Thread-1", queue)

thread2 = MyThread(2, "Thread-2", queue)

threads.append(thread1)

threads.append(thread2)

for t in threads:

t.start()

for i in range(10):

queue.put("Data %d" % i)

queue.put("exit")

for t in threads:

t.join()

print("Exiting Main Thread")

```

3. 线程池

线程池是一种线程管理机制,它会预先创建一定数量的线程,当有任务需要处理时,从线程池中取出一个线程进行处理,处理完毕后线程又会返回到线程池中。Python中多线程池可以通过ThreadPoolExecutor类来实现。下面是一个简单的示例:

```

import concurrent.futures

import time

def worker(num):

print("Worker %d started" % num)

time.sleep(1)

print("Worker %d finished" % num)

if __name__ == "__main__":

with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:

for i in range(5):

executor.submit(worker, i)

print("Exiting Main Thread")

```

五、总结

本文介绍了Python多线程的创建及使用方法,其中包括多线程的概念、Python中的多线程模块threading、Python多线程的创建方法和使用方法等多个方面。通过本文的学习,读者可以了解到Python多线程的基本原理和实现方法,从而提高Python多线程编程的技能。

5天短视频训练营
新手入门剪辑课程,零基础也能学
分享变现渠道,助你兼职赚钱
限时特惠:0元
立即抢
新手剪辑课程 (精心挑选,简单易学)
第一课
新手如何学剪辑视频? 开始学习
第二课
短视频剪辑培训班速成是真的吗? 开始学习
第三课
不需要付费的视频剪辑软件有哪些? 开始学习
第四课
手机剪辑app哪个好? 开始学习
第五课
如何做短视频剪辑赚钱? 开始学习
第六课
视频剪辑接单网站APP有哪些? 开始学习
第七课
哪里可以学短视频运营? 开始学习
第八课
做短视频运营需要会什么? 开始学习
相关问题
sql判断字段是否存在
python键值对
for循环可以遍历字典吗
怎么使用vscode
查看更多

客服热线:0731-85127885

湘ICP备19005950号-1  

工商营业执照信息

违法和不良信息举报

举报电话:0731-85127885 举报邮箱:tousu@csai.cn

优草派  版权所有 © 2024