关键词

浅谈一下python中threading模块

当谈及多线程编程时,Python提供了一个很好的标准模块——threading,该模块中包含了许多便于开发者编写高效线程的方法和类。本文将是一个浅显易懂、最常见用法的Python中的threading模块教程。让我们开始吧!

创建线程

首先就是要创建一个线程。Python使用threading模块创建和管理线程,其余语言通常是用类似pthreads的多线程库来完成。在Python中,我们可以使用threading类里的Thread(target[,args[,kwargs]])方法来创建线程。

这里“target”表示传入的函数,args和kwargs表示函数的参数。传递参数可以以列表或者字典形式传入。

比如,下面是一个示例代码:

import threading
import time

def worker(num):
    """ Thread worker function """
    time.sleep(1)
    print('Worker:', num)
    return

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

上面代码中,我们创建了5个新的线程,使用了Python的threading库中的Thread类。target参数是我们定义的worker函数,args则用于传递worker函数中的参数。程序执行后,可能会得到下面的输出:

Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4

线程同步

由于多线程可能会在访问共享数据时出错,所以线程同步是一个重要的问题。Python中提供了多种方式来控制线程,并且可以使用锁,条件变量和信号量等机制来保证并发访问的正确性。

这里我们看一下“锁”机制方式的示例。在标准库的threading模块中有一个叫作Lock的类,它是最基本和最低级别的同步机制。

import threading

initial_value = 10

def incrementor(lock):
    global initial_value
    for i in range(10000000):
        lock.acquire()
        initial_value += 1
        lock.release()

def decrementor(lock):
    global initial_value
    for i in range(10000000):
        lock.acquire()
        initial_value -= 1
        lock.release()

lock = threading.Lock()
t1 = threading.Thread(target=incrementor, args=(lock,))
t2 = threading.Thread(target=decrementor, args=(lock,))

t1.start()
t2.start()
t1.join()
t2.join()

print("The final value of initial_value is {}".format(initial_value))

上面代码中,我们创建了两个线程incrementordecrementor,它们分别对全局变量initial_value进行加1和减1的操作,每次进行加或减之前均需要先申请锁来确保只有线程拿到了锁并且执行完成后,其他线程才能继续执行。执行完之后,我们得到了输出结果:

The final value of initial_value is 10

总结

在这篇文章中,我们大致了解了Python的threading模块并学习了如何创建和运行线程以及如何使用“锁”机制同步线程的执行。这些都是Python中多线程编程的基本概念。

当然,threading模块还有其他更高级别和更灵活的功能可以使用,比如条件锁、信号量等等,这些内容我们留待以后的学习再去探讨。

本文链接:http://task.lmcjl.com/news/13555.html

展开阅读全文