詳解如何使用python創(chuàng)建和結(jié)束線(xiàn)程
python創(chuàng)建線(xiàn)程和結(jié)束線(xiàn)程
在 Python 中,線(xiàn)程是一種輕量級(jí)的執(zhí)行單元,允許我們?cè)诔绦蛑型瑫r(shí)執(zhí)行多個(gè)任務(wù)。線(xiàn)程的創(chuàng)建和結(jié)束是多線(xiàn)程編程中的核心概念之一。在本文中,我們將學(xué)習(xí)如何使用 Python 創(chuàng)建線(xiàn)程,并探討如何優(yōu)雅地結(jié)束線(xiàn)程。
創(chuàng)建線(xiàn)程
Python 中創(chuàng)建線(xiàn)程非常簡(jiǎn)單,可以使用 threading 模塊來(lái)實(shí)現(xiàn)。下面是一個(gè)簡(jiǎn)單的例子:
import threading
import time
def print_numbers():
for i in range(1, 6):
print(i)
time.sleep(1)
# 創(chuàng)建線(xiàn)程
thread = threading.Thread(target=print_numbers)
# 啟動(dòng)線(xiàn)程
thread.start()
# 主線(xiàn)程等待子線(xiàn)程執(zhí)行完成
thread.join()
print("線(xiàn)程執(zhí)行完成!")
在這個(gè)例子中,我們創(chuàng)建了一個(gè)名為 print_numbers 的函數(shù),該函數(shù)用于打印 1 到 5 的數(shù)字。然后,我們使用 threading.Thread 類(lèi)創(chuàng)建了一個(gè)新的線(xiàn)程,并指定了要執(zhí)行的目標(biāo)函數(shù)。最后,通過(guò)調(diào)用 start() 方法啟動(dòng)線(xiàn)程,通過(guò) join() 方法等待線(xiàn)程執(zhí)行完成。
結(jié)束線(xiàn)程
結(jié)束線(xiàn)程通常是為了讓程序在不需要線(xiàn)程繼續(xù)執(zhí)行時(shí)能夠正常退出,或者在特定條件下終止線(xiàn)程的執(zhí)行。在 Python 中,線(xiàn)程是無(wú)法直接終止的,但是可以通過(guò)設(shè)置標(biāo)志位或者發(fā)送信號(hào)的方式讓線(xiàn)程自行退出。下面是一個(gè)簡(jiǎn)單的例子:
import threading
import time
# 全局標(biāo)志位,控制線(xiàn)程執(zhí)行
is_running = True
def count_numbers():
i = 1
while is_running:
print(i)
i += 1
time.sleep(1)
# 創(chuàng)建線(xiàn)程
thread = threading.Thread(target=count_numbers)
# 啟動(dòng)線(xiàn)程
thread.start()
# 主線(xiàn)程等待一段時(shí)間后修改標(biāo)志位,結(jié)束線(xiàn)程
time.sleep(5)
is_running = False
print("等待線(xiàn)程執(zhí)行完成...")
thread.join()
print("線(xiàn)程執(zhí)行完成!")
在這個(gè)例子中,我們創(chuàng)建了一個(gè)名為 count_numbers 的函數(shù),該函數(shù)會(huì)不斷地打印數(shù)字,并通過(guò)一個(gè)全局變量 is_running 控制線(xiàn)程的執(zhí)行。在主線(xiàn)程中,我們等待了 5 秒后將 is_running 設(shè)置為 False,從而讓線(xiàn)程自行退出。
安全結(jié)束線(xiàn)程
除了設(shè)置標(biāo)志位的方式外,有時(shí)候我們可能需要更加安全和可靠地結(jié)束線(xiàn)程。Python 中的線(xiàn)程并沒(méi)有提供直接的方法來(lái)強(qiáng)制終止線(xiàn)程,但可以使用一些技巧來(lái)安全地結(jié)束線(xiàn)程,比如使用 Thread 對(duì)象的 Event。
下面是一個(gè)使用 Event 來(lái)結(jié)束線(xiàn)程的示例:
import threading
import time
# 創(chuàng)建 Event 對(duì)象
stop_event = threading.Event()
def count_numbers():
i = 1
while not stop_event.is_set():
print(i)
i += 1
time.sleep(1)
# 創(chuàng)建線(xiàn)程
thread = threading.Thread(target=count_numbers)
# 啟動(dòng)線(xiàn)程
thread.start()
# 主線(xiàn)程等待一段時(shí)間后設(shè)置 Event,結(jié)束線(xiàn)程
time.sleep(5)
stop_event.set()
print("等待線(xiàn)程執(zhí)行完成...")
thread.join()
print("線(xiàn)程執(zhí)行完成!")
在這個(gè)例子中,我們創(chuàng)建了一個(gè) Event 對(duì)象 stop_event,線(xiàn)程在每次循環(huán)中檢查該事件是否被設(shè)置。在主線(xiàn)程中,我們等待了 5 秒后設(shè)置了 stop_event,從而結(jié)束了線(xiàn)程的執(zhí)行。
異常處理
在線(xiàn)程中,異常的處理也是一個(gè)重要的問(wèn)題。如果線(xiàn)程中發(fā)生了異常而沒(méi)有處理,整個(gè)線(xiàn)程可能會(huì)意外終止。因此,在線(xiàn)程中要使用 try-except 語(yǔ)句來(lái)捕獲異常,并進(jìn)行適當(dāng)?shù)奶幚怼?/p>
下面是一個(gè)簡(jiǎn)單的例子:
import threading
import time
def task():
try:
# 這里是線(xiàn)程執(zhí)行的任務(wù)
print("任務(wù)開(kāi)始...")
time.sleep(3)
raise Exception("人為拋出異常")
except Exception as e:
print(f"捕獲到異常:{e}")
# 創(chuàng)建線(xiàn)程
thread = threading.Thread(target=task)
# 啟動(dòng)線(xiàn)程
thread.start()
# 主線(xiàn)程等待線(xiàn)程執(zhí)行完成
thread.join()
print("線(xiàn)程執(zhí)行完成!")
在這個(gè)例子中,線(xiàn)程中的任務(wù)拋出了一個(gè)異常,但由于我們?cè)?nbsp;task 函數(shù)中使用了 try-except 語(yǔ)句,因此異常被捕獲并打印出來(lái),而線(xiàn)程并沒(méi)有意外終止。
使用線(xiàn)程池管理線(xiàn)程
在實(shí)際開(kāi)發(fā)中,如果需要頻繁地創(chuàng)建和銷(xiāo)毀線(xiàn)程,可能會(huì)導(dǎo)致性能下降。為了更有效地管理線(xiàn)程,可以使用線(xiàn)程池來(lái)重用線(xiàn)程對(duì)象。Python 提供了 concurrent.futures 模塊,其中的 ThreadPoolExecutor 類(lèi)可以幫助我們輕松地管理線(xiàn)程池。
下面是一個(gè)使用線(xiàn)程池的例子:
from concurrent.futures import ThreadPoolExecutor
import time
def task(n):
print(f"任務(wù) {n} 開(kāi)始...")
time.sleep(2)
print(f"任務(wù) {n} 完成!")
# 創(chuàng)建線(xiàn)程池
with ThreadPoolExecutor(max_workers=3) as executor:
# 提交任務(wù)給線(xiàn)程池執(zhí)行
for i in range(1, 6):
executor.submit(task, i)
print("所有任務(wù)執(zhí)行完成!")
在這個(gè)例子中,我們使用 ThreadPoolExecutor 創(chuàng)建了一個(gè)最大工作線(xiàn)程數(shù)為 3 的線(xiàn)程池。然后,我們提交了 5 個(gè)任務(wù)給線(xiàn)程池執(zhí)行。線(xiàn)程池會(huì)自動(dòng)管理線(xiàn)程的創(chuàng)建和銷(xiāo)毀,以及任務(wù)的調(diào)度。
使用 threading.Thread 的子類(lèi)
除了直接使用 threading.Thread 類(lèi)外,我們還可以通過(guò)繼承 threading.Thread 創(chuàng)建自定義的線(xiàn)程類(lèi)。這樣做可以更好地組織代碼,并且可以在子類(lèi)中重寫(xiě) run() 方法來(lái)定義線(xiàn)程執(zhí)行的邏輯。
下面是一個(gè)簡(jiǎn)單的例子:
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f"{self.name} 線(xiàn)程開(kāi)始執(zhí)行...")
time.sleep(3)
print(f"{self.name} 線(xiàn)程執(zhí)行完成!")
# 創(chuàng)建線(xiàn)程實(shí)例并啟動(dòng)
thread1 = MyThread("Thread 1")
thread2 = MyThread("Thread 2")
thread1.start()
thread2.start()
# 等待線(xiàn)程執(zhí)行完成
thread1.join()
thread2.join()
print("所有線(xiàn)程執(zhí)行完成!")
在這個(gè)例子中,我們定義了一個(gè) MyThread 類(lèi),繼承自 threading.Thread,并重寫(xiě)了 run() 方法來(lái)定義線(xiàn)程執(zhí)行的邏輯。然后,我們創(chuàng)建了兩個(gè) MyThread 的實(shí)例,并啟動(dòng)了這兩個(gè)線(xiàn)程。
線(xiàn)程同步與共享資源
在多線(xiàn)程編程中,經(jīng)常會(huì)遇到多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)共享資源的情況。為了避免競(jìng)爭(zhēng)條件和數(shù)據(jù)不一致的問(wèn)題,需要使用線(xiàn)程同步機(jī)制來(lái)保護(hù)共享資源。
使用鎖(Lock)
鎖是最常見(jiàn)的線(xiàn)程同步機(jī)制之一,Python 中的 threading.Lock 類(lèi)可以用來(lái)創(chuàng)建鎖對(duì)象。在訪(fǎng)問(wèn)共享資源之前,線(xiàn)程可以通過(guò)調(diào)用 acquire() 方法獲取鎖,訪(fǎng)問(wèn)完成后再調(diào)用 release() 方法釋放鎖。
下面是一個(gè)使用鎖來(lái)保護(hù)共享資源的例子:
import threading
shared_resource = 0
lock = threading.Lock()
def update_shared_resource():
global shared_resource
for _ in range(100000):
lock.acquire()
shared_resource += 1
lock.release()
# 創(chuàng)建多個(gè)線(xiàn)程來(lái)更新共享資源
threads = []
for _ in range(5):
t = threading.Thread(target=update_shared_resource)
threads.append(t)
t.start()
# 等待所有線(xiàn)程執(zhí)行完成
for t in threads:
t.join()
print("共享資源的值為:", shared_resource)
在這個(gè)例子中,我們創(chuàng)建了一個(gè)名為 shared_resource 的共享變量,然后使用 threading.Lock 創(chuàng)建了一個(gè)鎖對(duì)象 lock。在 update_shared_resource 函數(shù)中,我們使用鎖來(lái)保護(hù)對(duì) shared_resource 的訪(fǎng)問(wèn),從而避免了多個(gè)線(xiàn)程同時(shí)修改共享資源的問(wèn)題。
使用條件變量(Condition)
條件變量是另一種常見(jiàn)的線(xiàn)程同步機(jī)制,Python 中的 threading.Condition 類(lèi)可以用來(lái)創(chuàng)建條件變量對(duì)象。條件變量通常與鎖結(jié)合使用,可以在滿(mǎn)足特定條件時(shí)通知等待的線(xiàn)程。
下面是一個(gè)使用條件變量來(lái)實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式的例子:
import threading
import time
MAX_ITEMS = 5
items = []
condition = threading.Condition()
def producer():
for i in range(10):
time.sleep(1)
with condition:
if len(items) >= MAX_ITEMS:
print("倉(cāng)庫(kù)已滿(mǎn),生產(chǎn)者等待...")
condition.wait()
print("生產(chǎn)者生產(chǎn)一個(gè)商品")
items.append(i)
condition.notify()
def consumer():
for i in range(10):
time.sleep(1.5)
with condition:
while not items:
print("倉(cāng)庫(kù)為空,消費(fèi)者等待...")
condition.wait()
item = items.pop(0)
print(f"消費(fèi)者消費(fèi)了商品 {item}")
condition.notify()
# 創(chuàng)建生產(chǎn)者和消費(fèi)者線(xiàn)程并啟動(dòng)
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
producer_thread.start()
consumer_thread.start()
# 等待線(xiàn)程執(zhí)行完成
producer_thread.join()
consumer_thread.join()
print("所有商品已被生產(chǎn)和消費(fèi)完畢!")
在這個(gè)例子中,我們使用了條件變量 condition 來(lái)實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式。生產(chǎn)者線(xiàn)程在倉(cāng)庫(kù)滿(mǎn)時(shí)等待,消費(fèi)者線(xiàn)程在倉(cāng)庫(kù)空時(shí)等待,并在生產(chǎn)或消費(fèi)完成后通過(guò) notify() 方法通知等待的線(xiàn)程。
使用隊(duì)列實(shí)現(xiàn)線(xiàn)程間通信
除了使用鎖和條件變量等同步機(jī)制外,還可以使用隊(duì)列來(lái)實(shí)現(xiàn)線(xiàn)程間的安全通信。Python 中的 queue.Queue 類(lèi)提供了線(xiàn)程安全的隊(duì)列實(shí)現(xiàn),可以在多個(gè)線(xiàn)程之間安全地傳遞數(shù)據(jù)。
下面是一個(gè)使用隊(duì)列實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式的例子:
import threading
import queue
import time
MAX_ITEMS = 5
queue = queue.Queue(MAX_ITEMS)
def producer():
for i in range(10):
time.sleep(1)
try:
queue.put(i, block=True, timeout=1)
print("生產(chǎn)者生產(chǎn)一個(gè)商品")
except queue.Full:
print("倉(cāng)庫(kù)已滿(mǎn),生產(chǎn)者等待...")
def consumer():
for i in range(10):
time.sleep(1.5)
try:
item = queue.get(block=True, timeout=1)
print(f"消費(fèi)者消費(fèi)了商品 {item}")
except queue.Empty:
print("倉(cāng)庫(kù)為空,消費(fèi)者等待...")
# 創(chuàng)建生產(chǎn)者和消費(fèi)者線(xiàn)程并啟動(dòng)
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
producer_thread.start()
consumer_thread.start()
# 等待線(xiàn)程執(zhí)行完成
producer_thread.join()
consumer_thread.join()
print("所有商品已被生產(chǎn)和消費(fèi)完畢!")
在這個(gè)例子中,我們使用了 queue.Queue 類(lèi)來(lái)實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式。生產(chǎn)者線(xiàn)程通過(guò) put() 方法向隊(duì)列中添加商品,消費(fèi)者線(xiàn)程通過(guò) get() 方法從隊(duì)列中取出商品。當(dāng)隊(duì)列已滿(mǎn)時(shí),生產(chǎn)者線(xiàn)程會(huì)等待;當(dāng)隊(duì)列為空時(shí),消費(fèi)者線(xiàn)程會(huì)等待。
使用隊(duì)列實(shí)現(xiàn)線(xiàn)程間通信的好處在于,它提供了一種簡(jiǎn)單而安全的方式來(lái)傳遞數(shù)據(jù),避免了顯式的鎖和條件變量的使用。
定時(shí)結(jié)束線(xiàn)程
有時(shí)候,我們希望線(xiàn)程在一定時(shí)間內(nèi)執(zhí)行完畢或者超時(shí)退出。Python 中可以利用定時(shí)器來(lái)實(shí)現(xiàn)這一功能。定時(shí)器可以在指定的時(shí)間后觸發(fā)一個(gè)事件,我們可以利用這個(gè)特性來(lái)控制線(xiàn)程的執(zhí)行時(shí)間。
下面是一個(gè)使用定時(shí)器結(jié)束線(xiàn)程的例子:
import threading
import time
def task():
print("線(xiàn)程開(kāi)始執(zhí)行...")
time.sleep(3) # 模擬線(xiàn)程執(zhí)行時(shí)間
print("線(xiàn)程執(zhí)行完成!")
# 創(chuàng)建線(xiàn)程
thread = threading.Thread(target=task)
# 啟動(dòng)線(xiàn)程
thread.start()
# 定時(shí)器,3秒后設(shè)置線(xiàn)程結(jié)束標(biāo)志
def set_thread_finished():
print("定時(shí)器觸發(fā),設(shè)置線(xiàn)程結(jié)束標(biāo)志...")
thread.finished = True
timer = threading.Timer(3, set_thread_finished)
timer.start()
# 主線(xiàn)程等待線(xiàn)程執(zhí)行完成
thread.join()
print("線(xiàn)程執(zhí)行完成!")
在這個(gè)例子中,我們創(chuàng)建了一個(gè)定時(shí)器 timer,在 3 秒后觸發(fā) set_thread_finished 函數(shù),該函數(shù)設(shè)置了線(xiàn)程的結(jié)束標(biāo)志。線(xiàn)程在執(zhí)行時(shí)會(huì)檢查結(jié)束標(biāo)志,如果標(biāo)志被設(shè)置,則提前退出。這樣就實(shí)現(xiàn)了在指定時(shí)間后結(jié)束線(xiàn)程的功能。
使用 threading.Event 實(shí)現(xiàn)線(xiàn)程等待
除了定時(shí)器,我們還可以使用 threading.Event 來(lái)實(shí)現(xiàn)線(xiàn)程的等待和超時(shí)退出。Event 是線(xiàn)程間通信的一種機(jī)制,可以用來(lái)設(shè)置信號(hào)、等待信號(hào)等操作。
下面是一個(gè)使用 Event 實(shí)現(xiàn)線(xiàn)程等待的例子:
import threading
import time
# 創(chuàng)建 Event 對(duì)象
event = threading.Event()
def task():
print("線(xiàn)程開(kāi)始執(zhí)行...")
event.wait(3) # 等待事件觸發(fā),超時(shí)時(shí)間為3秒
if event.is_set():
print("事件被觸發(fā),線(xiàn)程執(zhí)行完成!")
else:
print("超時(shí)退出,線(xiàn)程執(zhí)行未完成!")
# 創(chuàng)建線(xiàn)程
thread = threading.Thread(target=task)
# 啟動(dòng)線(xiàn)程
thread.start()
# 等待一段時(shí)間后設(shè)置事件
time.sleep(2)
print("等待2秒后設(shè)置事件...")
event.set()
# 主線(xiàn)程等待線(xiàn)程執(zhí)行完成
thread.join()
print("線(xiàn)程執(zhí)行完成!")
在這個(gè)例子中,線(xiàn)程在執(zhí)行時(shí)等待事件的觸發(fā),如果在3秒內(nèi)事件被設(shè)置,則線(xiàn)程執(zhí)行完成;否則,線(xiàn)程會(huì)在超時(shí)后退出。這樣就實(shí)現(xiàn)了在指定時(shí)間內(nèi)結(jié)束線(xiàn)程的功能。
總結(jié)
在本文中,我們探討了在 Python 中創(chuàng)建線(xiàn)程、結(jié)束線(xiàn)程以及線(xiàn)程管理的多種方法。我們從創(chuàng)建線(xiàn)程的基礎(chǔ)開(kāi)始,介紹了使用 threading 模塊創(chuàng)建線(xiàn)程的方法,并展示了如何優(yōu)雅地結(jié)束線(xiàn)程。接著,我們深入討論了線(xiàn)程同步與共享資源的問(wèn)題,介紹了使用鎖、條件變量和隊(duì)列等機(jī)制來(lái)保護(hù)共享資源、實(shí)現(xiàn)線(xiàn)程間通信的方法。然后,我們探討了如何使用定時(shí)器和事件來(lái)實(shí)現(xiàn)線(xiàn)程的定時(shí)結(jié)束和超時(shí)退出,從而更靈活地控制線(xiàn)程的執(zhí)行時(shí)間。
總的來(lái)說(shuō),本文全面介紹了多線(xiàn)程編程中的關(guān)鍵概念和技術(shù),并提供了豐富的代碼示例來(lái)幫助讀者更好地理解和應(yīng)用這些技術(shù)。通過(guò)合理地使用線(xiàn)程管理和同步機(jī)制,我們可以編寫(xiě)出高效、可靠的多線(xiàn)程程序,更好地利用計(jì)算資源,提高程序的性能和可維護(hù)性。希望本文對(duì)讀者在 Python 多線(xiàn)程編程方面有所幫助。
以上就是詳解如何使用python創(chuàng)建和結(jié)束線(xiàn)程的詳細(xì)內(nèi)容,更多關(guān)于python創(chuàng)建和結(jié)束線(xiàn)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python實(shí)現(xiàn)微信拍一拍功能的思路代碼
這篇文章主要介紹了使用Python實(shí)現(xiàn)微信“拍一拍”的思路代碼,,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
顯卡驅(qū)動(dòng)CUDA?和?pytorch?CUDA?之間的區(qū)別
本文主要介紹了顯卡驅(qū)動(dòng)CUDA?和?pytorch?CUDA?之間的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
python爬蟲(chóng)系列網(wǎng)絡(luò)請(qǐng)求案例詳解
這篇文章主要介紹了【Python從零到壹】python爬蟲(chóng)系列-網(wǎng)絡(luò)請(qǐng)求,從零開(kāi)始學(xué)習(xí)Python網(wǎng)絡(luò)爬蟲(chóng),如何從中獲取需要的數(shù)據(jù)信息,現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí)2021-04-04
Python中.py程序在CMD控制臺(tái)以指定虛擬環(huán)境運(yùn)行
本文主要介紹了Python中.py程序在CMD控制臺(tái)以指定虛擬環(huán)境運(yùn)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
pygame實(shí)現(xiàn)鍵盤(pán)和鼠標(biāo)事件的處理
這篇文章主要介紹了pygame實(shí)現(xiàn)鍵盤(pán)和鼠標(biāo)事件的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
python中關(guān)于decimal使用出現(xiàn)的一些問(wèn)題
這篇文章主要介紹了python中關(guān)于decimal使用出現(xiàn)的一些問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
用Python編程實(shí)現(xiàn)語(yǔ)音控制電腦
是否經(jīng)常好萊塢電影里看強(qiáng)大的語(yǔ)音識(shí)別系統(tǒng)? 是否每每看到都會(huì)羨慕嫉妒恨? 可是我們真心買(mǎi)不起啊。2014-04-04
Python名片管理系統(tǒng)+猜拳小游戲案例實(shí)現(xiàn)彩(色控制臺(tái)版)
這篇文章主要介紹了Python名片管理系統(tǒng)+猜拳小游戲案例實(shí)現(xiàn)彩(色控制臺(tái)版),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-08-08
python?open讀取文件內(nèi)容時(shí)的mode模式解析
這篇文章主要介紹了python?open讀取文件內(nèi)容時(shí)的mode模式解析,Python可以使用open函數(shù)來(lái)實(shí)現(xiàn)文件的打開(kāi),關(guān)閉,讀寫(xiě)操作,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

