2016 - 2024

感恩一路有你

Python多线程如何使用全局ThreadLocal对象

浏览量:2535 时间:2024-02-05 09:36:56 作者:采采

在编写Python多线程程序时,我们经常会遇到不同线程的局部变量需要传递的问题。为了解决这个问题,Python引入了ThreadLocal对象。本文将通过一个案例来演示如何使用全局ThreadLocal对象。

案例环境准备

首先,我们需要在一台Ubuntu虚拟机上进行实验。打开VMware虚拟化软件,并启动Ubuntu虚拟机。登录系统后,在桌面空白处右键鼠标,选择“打开终端”。

创建并编辑代码文件

在终端中使用gedit编辑器创建一个名为的文件,命令如下:

```

gedit

```

在文件中,编写以下代码:

```python

from threading import Thread

class Student:

def __init__(self, name):

name

def pro_func(self, name):

std Student(name)

self.task1(std)

self.task2(std)

def task1(self, std):

print('我是task1:', )

def task2(self, std):

print('我是task2:', )

t1 Thread(target_func, args('denny',))

t2 Thread(target_func, args('andy',))

()

()

()

()

```

运行代码并观察结果

在终端中运行以下命令执行代码:

```

python3

```

结果如下图所示,每个线程都打印出了两次。这种方法在函数之间传递参数比较麻烦。

使用全局字典解决传参问题

为了避免传递参数的麻烦,我们可以使用全局字典的方法来解决。修改代码如下:

```python

from threading import Thread, current_thread

class Student:

def __init__(self, name):

name

global_dict {}

def pro_func(name):

std Student(name)

global_dict[current_thread()] std

task1()

task2()

def task1():

std global_dict[current_thread()]

print('我是task1:', )

def task2():

std global_dict[current_thread()]

print('我是task2:', )

t1 Thread(targetpro_func, args('denny',))

t2 Thread(targetpro_func, args('andy',))

()

()

()

()

```

再次运行代码并观察结果

在终端中运行以下命令执行代码:

```

python3

```

结果如下图所示,尽管没有传递变量的问题了,但是每个线程依然不能单独处理不同的Student对象。

使用ThreadLocal对象解决问题

为了实现单独处理不同的Student对象的功能,我们可以使用ThreadLocal对象。修改代码如下:

```python

from threading import Thread, current_thread, local

localstd local()

def pro_func(name):

name

task()

def task():

print('我是task:', )

t1 Thread(targetpro_func, args('denny',))

t2 Thread(targetpro_func, args('andy',))

()

()

()

()

```

再次运行代码并观察结果

在终端中运行以下命令执行代码:

```

python3

```

结果如下图所示,对于每个线程而言,都是线程的局部变量,实现了单独处理不同的Student对象的功能。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。