• 周四. 11月 21st, 2024

Python 多线程编程

在 Python 中,你可以使用 threading 模块来创建线程。这个模块提供了一个 Thread 类来表示一个线程,以及一些其他的用于管理线程的工具。

下面是一个简单的例子,展示了如何创建一个线程并启动它:





import threading

def func():
    print("func() running")

# Create a thread
t = threading.Thread(target=func)

# Start the thread
t.start()

在上面的例子中,我们创建了一个 Thread 对象,并将一个函数作为参数传递给它。当我们调用 start() 方法时,线程就会被启动。

你还可以通过继承 threading.Thread 类来创建自定义线程类:





import threading

class MyThread(threading.Thread):
    def run(self):
        print("MyThread running")

# Create a thread
t = MyThread()

# Start the thread
t.start()

在这种情况下,你需要实现一个 run() 方法来定义线程的行为。

注意,线程是独立的执行单元,并且它们是并发执行的。这意味着你无法确定线程什么时候会完成,也无法确定它们的执行顺序。

如果你想要等待一个线程完成,可以调用它的 join() 方法:





t.join()

这会阻塞主线程,直到线程 t 完成。

除了 Thread 类之外,threading 模块还提供了一些其他的工具来管理线程,包括:

  • Lock: 这是一个互斥锁,用于保护共享资源的访问。当一个线程获得锁之后,其他线程就无法访问这个资源,直到锁被释放。

例子:





lock = threading.Lock()

with lock:
    # Critical section of code
    pass
  • RLock: 这是一个可重入的锁,它允许一个线程多次获得同一个锁。这对于避免死锁很有用。
  • Semaphore: 这是一个信号量,用于控制对共享资源的访问。它具有一个计数器,可以限制同时访问资源的线程数。
  • Event: 这是一个事件对象,用于在线程间同步。一个线程可以等待事件的发生,或者发出事件通知其他线程。
  • Timer: 这是一个定时器线程,它在指定的时间后执行一个函数。

使用这些工具,你可以构建出复杂的多线程程序来执行多个任务。但是,多线程编程也有一些挑战,例如线程安全问题和死锁问题。需要注意避免这些问题。

最后,请注意,Python 的 threading 模块并不是真正的多线程。它实际上是使用了操作系统的协程机制来模拟多线程的行为。因此,如果你想要使用真正的多线程,你可以使用 Python 的 multiprocessing 模块,它使用了真正的多进程机制。

阅读  Python 协程用法详解

然而,多进程编程常常比多线程编程更加复杂,因为进程之间的通信和数据共享比较困难。所以,在大多数情况下,多线程编程就足以满足需求了。