VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python多线程Threading、子线程与守护线程实例详解

当然,Python的`threading`模块提供了基本的线程和同步原语支持。在这个模块中,你可以创建线程、守护线程以及使用各种同步机制来控制线程的执行。下面,我将通过一些实例来详细解释这些概念。
 
### 1. 基本的线程创建
 
首先,我们来看如何使用`threading.Thread`类来创建一个基本的线程。
 
import threading
import time
 
def print_numbers():
    for i in range(5):
        time.sleep(1)
        print(i)
 
# 创建线程
thread = threading.Thread(target=print_numbers)
 
# 启动线程
thread.start()
 
# 主线程继续执行
for i in 'abcde':
    time.sleep(0.5)
    print(i)
 
# 等待子线程完成(在这个例子中,其实主线程已经结束,因为Python解释器会等待所有非守护线程完成)
thread.join()
 
### 2. 守护线程(Daemon Threads)
 
守护线程是一种特殊的线程,它会在主线程结束时自动退出,不管它是否完成了任务。守护线程主要用于那些必须在主程序退出前完成的后台任务,如清理工作等。
 
import threading
import time
 
def daemon_task():
    while True:
        time.sleep(1)
        print("Daemon is still running")
 
# 创建守护线程
daemon_thread = threading.Thread(target=daemon_task)
daemon_thread.daemon = True  # 设置为守护线程
 
# 启动线程
daemon_thread.start()
 
# 主线程结束,守护线程也会跟着结束
print("Main thread ending...")
 
在这个例子中,守护线程`daemon_thread`将不会无限循环下去,因为主线程结束了,而`daemon_thread`被设置为守护线程。
 
### 3. 线程同步
 
当多个线程需要共享资源时,就需要进行线程同步,以防止数据竞争和条件竞争。Python的`threading`模块提供了多种同步机制,如锁(Lock)、条件变量(Condition)、信号量(Semaphore)等。
 
这里,我们简单展示如何使用锁(Lock)来同步线程。
 
import threading
 
counter = 0
lock = threading.Lock()
 
def increment():
    global counter
    for _ in range(100000):
        lock.acquire()  # 获取锁
        try:
            counter += 1
        finally:
            lock.release()  # 释放锁
 
threads = []
for _ in range(2):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()
 
for t in threads:
    t.join()
 
print(f"Final counter: {counter}")
 
在这个例子中,我们创建了两个线程来同时修改一个全局变量`counter`。通过使用锁,我们确保了在任何时刻只有一个线程能够修改`counter`,从而避免了数据竞争。
 
这些只是`threading`模块中的冰山一角。Python的`threading`模块还提供了许多其他功能,如事件(Event)、定时器(Timer)等,你可以根据具体需求来探索和使用它们。

最后,如果你对python语言还有任何疑问或者需要进一步的帮助,请访问https://www.xin3721.com 本站原创,转载请注明出处:https://www.xin3721.com/Python/python50142.html


相关教程