Python多進程操作文件加鎖的項目實踐
在現(xiàn)代Python開發(fā)中,多進程編程已成為提升程序性能的重要手段。然而,當多個進程需要同時操作同一文件時,若缺乏適當?shù)耐綑C制,可能導(dǎo)致數(shù)據(jù)損壞、內(nèi)容混亂等嚴重問題。文件加鎖作為解決這一問題的關(guān)鍵技術(shù),是每一位Python開發(fā)者必須掌握的技能。本文將全面深入地探討Python多進程環(huán)境下的文件加鎖機制,從基礎(chǔ)概念到高級實踐,幫助你構(gòu)建安全可靠的多進程文件操作方案。
多進程文件操作的挑戰(zhàn)
在單進程程序中,文件操作通常是線性執(zhí)行的,我們無需擔心并發(fā)問題。但當引入多進程后,情況變得復(fù)雜起來。多個進程可能同時嘗試讀取、寫入、修改同一文件,這種并發(fā)操作會引發(fā)一系列問題。
數(shù)據(jù)一致性問題
當兩個進程同時寫入同一文件時,最常見的問題是數(shù)據(jù)交錯。例如,進程A正在寫入"Hello",進程B同時寫入"World",最終文件可能包含"HWeloorld"這類混亂內(nèi)容。更嚴重的是,如果兩個進程同時修改文件的同一部分,可能導(dǎo)致數(shù)據(jù)丟失或損壞。
文件完整性風(fēng)險
文件操作通常不是原子性的,尤其是復(fù)雜的寫入或修改操作。如果一個進程正在寫入文件時被另一個進程中斷,可能導(dǎo)致文件結(jié)構(gòu)損壞,使其無法被正確讀取。對于數(shù)據(jù)庫文件、日志文件等關(guān)鍵數(shù)據(jù),這種損壞可能造成嚴重后果。
資源競爭與性能問題
即使沒有直接的數(shù)據(jù)沖突,多個進程頻繁爭奪文件資源也會導(dǎo)致性能下降。進程可能反復(fù)嘗試訪問被鎖定的文件,造成CPU時間的浪費和響應(yīng)延遲。
文件加鎖的基本概念
文件加鎖是一種同步機制,用于控制多個進程對同一文件的訪問。通過加鎖,我們可以確保在任何時刻,只有一個進程能夠執(zhí)行特定的文件操作,從而避免并發(fā)沖突。
共享鎖與排他鎖
文件加鎖主要分為兩種類型:
- 共享鎖(Shared Lock):也稱為讀鎖,多個進程可以同時獲取同一文件的共享鎖,用于并發(fā)讀取操作。共享鎖之間不互斥,一個進程持有共享鎖時,其他進程也可以獲取共享鎖,但不能獲取排他鎖。
- 排他鎖(Exclusive Lock):也稱為寫鎖,用于文件寫入操作。排他鎖是互斥的,當一個進程持有排他鎖時,其他進程既不能獲取共享鎖,也不能獲取排他鎖,必須等待鎖釋放后才能進行操作。
這種鎖機制遵循"多讀單寫"原則,既保證了讀取操作的并發(fā)性能,又確保了寫入操作的安全性。
鎖的粒度
鎖的粒度指的是被鎖定的資源范圍。在文件操作中,我們可以鎖定整個文件,也可以只鎖定文件的特定部分(字節(jié)范圍)。
- 整個文件鎖:最簡單的鎖機制,鎖定整個文件,適用于需要完整操作文件的場景。
- 字節(jié)范圍鎖:只鎖定文件中的特定字節(jié)范圍,允許不同進程同時操作文件的不同部分,能提供更細粒度的控制和更高的并發(fā)性能。
阻塞與非阻塞鎖
根據(jù)獲取鎖時的行為,鎖可以分為:
- 阻塞鎖:當進程嘗試獲取已被鎖定的資源時,會進入等待狀態(tài),直到鎖被釋放。這種方式可以保證操作的最終執(zhí)行,但可能導(dǎo)致進程長時間等待。
- 非阻塞鎖:當進程嘗試獲取已被鎖定的資源時,會立即返回失敗,而不是等待。這種方式可以避免進程阻塞,但需要開發(fā)者處理獲取鎖失敗的情況。
Python中的文件加鎖機制
Python提供了多種實現(xiàn)文件加鎖的方式,每種方式都有其適用場景和平臺限制。下面我們詳細介紹各種方法的使用。
fcntl模塊:Unix系統(tǒng)的文件控制
fcntl模塊是Python標準庫中用于Unix系統(tǒng)文件控制的模塊,提供了文件加鎖功能。它直接調(diào)用了Unix系統(tǒng)的fcntl系統(tǒng)調(diào)用,因此僅在Unix類系統(tǒng)(Linux、macOS等)上可用。
基本使用方法
fcntl模塊的flock()函數(shù)可以實現(xiàn)文件加鎖,其基本語法如下:
import fcntl
# 打開文件
with open("data.txt", "r+") as f:
# 獲取排他鎖
fcntl.flock(f, fcntl.LOCK_EX)
# 執(zhí)行文件操作
content = f.read()
f.seek(0)
f.write(content + "new data")
f.truncate()
# 釋放鎖(退出with塊時文件關(guān)閉,鎖也會自動釋放)
flock()函數(shù)的第二個參數(shù)指定鎖的類型:
fcntl.LOCK_EX:排他鎖fcntl.LOCK_SH:共享鎖fcntl.LOCK_UN:釋放鎖fcntl.LOCK_NB:非阻塞模式(需與其他鎖類型組合使用)
非阻塞鎖示例
使用LOCK_NB標志可以實現(xiàn)非阻塞鎖:
import fcntl
import errno
with open("data.txt", "r") as f:
try:
# 嘗試獲取共享鎖,不阻塞
fcntl.flock(f, fcntl.LOCK_SH | fcntl.LOCK_NB)
print("成功獲取共享鎖")
# 執(zhí)行讀取操作
content = f.read()
# 釋放鎖
fcntl.flock(f, fcntl.LOCK_UN)
except BlockingIOError as e:
if e.errno == errno.EWOULDBLOCK:
print("無法獲取鎖,文件已被鎖定")
else:
raise
字節(jié)范圍鎖
除了flock(),fcntl模塊的fcntl()函數(shù)還支持字節(jié)范圍鎖:
import fcntl
import struct
def lock_range(fd, start, length, exclusive=True):
# 構(gòu)建鎖結(jié)構(gòu)
lock_type = fcntl.F_WRLCK if exclusive else fcntl.F_RDLCK
lock_struct = struct.pack('hhllhh', lock_type, 0, start, length, 0, 0)
fcntl.fcntl(fd, fcntl.F_SETLK, lock_struct)
def unlock_range(fd, start, length):
lock_struct = struct.pack('hhllhh', fcntl.F_UNLCK, 0, start, length, 0, 0)
fcntl.fcntl(fd, fcntl.F_SETLK, lock_struct)
# 使用示例
with open("large_file.dat", "r+") as f:
# 鎖定文件的第100-200字節(jié)
lock_range(f, 100, 100)
# 操作該范圍的數(shù)據(jù)
f.seek(100)
data = f.read(100)
# 處理數(shù)據(jù)...
f.seek(100)
f.write(processed_data)
# 解鎖
unlock_range(f, 100, 100)
flock()和fcntl()的主要區(qū)別在于:flock()只能鎖定整個文件,而fcntl()支持字節(jié)范圍鎖;flock()的鎖會與文件描述符關(guān)聯(lián),而fcntl()的鎖則與文件inode關(guān)聯(lián)。
msvcrt模塊:Windows系統(tǒng)的文件控制
對于Windows系統(tǒng),Python標準庫提供了msvcrt模塊來實現(xiàn)文件加鎖功能。該模塊的locking()函數(shù)可以對文件的特定區(qū)域進行加鎖。
import msvcrt
import os
def lock_file(f, exclusive=True):
# 鎖定整個文件
f.seek(0, os.SEEK_END)
file_size = f.tell()
f.seek(0)
# 鎖定類型:1表示共享鎖,2表示排他鎖
lock_type = 2 if exclusive else 1
msvcrt.locking(f.fileno(), lock_type, file_size)
def unlock_file(f):
# 解鎖整個文件
f.seek(0, os.SEEK_END)
file_size = f.tell()
f.seek(0)
# 8表示解鎖
msvcrt.locking(f.fileno(), 8, file_size)
# 使用示例
with open("data.txt", "r+") as f:
try:
# 獲取排他鎖
lock_file(f)
# 執(zhí)行文件操作
content = f.read()
f.seek(0)
f.write(content + "new data")
f.truncate()
finally:
# 確保解鎖
unlock_file(f)
msvcrt.locking()函數(shù)的第二個參數(shù)指定操作類型:
- 1:共享鎖(讀鎖)
- 2:排他鎖(寫鎖)
- 8:解鎖
需要注意的是,msvcrt.locking()函數(shù)鎖定的是文件的字節(jié)范圍,且當文件關(guān)閉時,所有鎖都會自動釋放。此外,該函數(shù)在無法獲取鎖時會阻塞,沒有直接的非阻塞選項,需要通過其他方式實現(xiàn)。
filelock庫:跨平臺的文件鎖解決方案
由于標準庫中的文件加鎖功能存在平臺限制,第三方庫filelock提供了跨平臺的文件鎖實現(xiàn)。它在Unix系統(tǒng)上使用fcntl,在Windows系統(tǒng)上使用msvcrt,為開發(fā)者提供了統(tǒng)一的API。
安裝filelock
pip install filelock
基本使用方法
from filelock import FileLock
# 創(chuàng)建鎖文件和數(shù)據(jù)文件
lock = FileLock("data.txt.lock")
data_file = "data.txt"
with lock:
# 在with塊中,鎖被獲取
with open(data_file, "a") as f:
f.write("新的數(shù)據(jù)行\(zhòng)n")
# 退出with塊后,鎖自動釋放
FileLock會創(chuàng)建一個額外的.lock文件來實現(xiàn)鎖機制,這是一種基于文件存在性的鎖實現(xiàn)方式。當獲取鎖時,它會嘗試創(chuàng)建.lock文件;釋放鎖時,則刪除該文件。
非阻塞模式
from filelock import FileLock, Timeout
lock = FileLock("data.txt.lock", timeout=0) # timeout=0表示非阻塞
try:
with lock.acquire(timeout=0): # 也可以在這里指定timeout
with open("data.txt", "r") as f:
content = f.read()
print(f"讀取內(nèi)容: {content}")
except Timeout:
print("無法獲取鎖,已被其他進程占用")
手動控制鎖的獲取與釋放
除了使用上下文管理器,也可以手動控制鎖的獲取和釋放:
lock = FileLock("data.txt.lock")
try:
# 獲取鎖,最多等待5秒
lock.acquire(timeout=5)
# 執(zhí)行文件操作
with open("data.txt", "r+") as f:
content = f.read()
# 處理內(nèi)容...
finally:
# 確保釋放鎖
if lock.is_locked:
lock.release()
filelock庫的優(yōu)勢在于跨平臺兼容性和簡單易用的API,適合大多數(shù)不需要細粒度控制的場景。其缺點是基于額外的.lock文件實現(xiàn),相比系統(tǒng)級別的鎖,可能存在一定的性能開銷。
多進程文件加鎖實踐
了解了各種文件加鎖機制后,我們來探討在實際多進程環(huán)境中如何應(yīng)用這些技術(shù)。
多進程寫入同一日志文件
日志文件是多進程環(huán)境中常見的共享資源。多個進程需要將日志信息寫入同一文件,我們需要確保每條日志的完整性和順序性。
import multiprocessing
import time
import random
from filelock import FileLock
def write_log(process_id, lock_file, log_file):
lock = FileLock(lock_file)
for i in range(5):
# 生成日志內(nèi)容
log_message = f"進程 {process_id} 日志 {i}: {time.ctime()}\n"
# 獲取鎖并寫入日志
with lock:
with open(log_file, "a") as f:
f.write(log_message)
# 隨機休眠,模擬不同進程的執(zhí)行間隔
time.sleep(random.uniform(0.1, 0.5))
if __name__ == "__main__":
log_file = "app.log"
lock_file = "app.log.lock"
# 清除現(xiàn)有日志
with open(log_file, "w") as f:
pass
# 創(chuàng)建5個進程
processes = []
for i in range(5):
p = multiprocessing.Process(target=write_log, args=(i, lock_file, log_file))
processes.append(p)
p.start()
# 等待所有進程完成
for p in processes:
p.join()
print("所有進程完成,日志已寫入")
在這個例子中,每個進程在寫入日志前都會獲取鎖,確保同一時間只有一個進程在寫入,避免了日志內(nèi)容的交錯。使用filelock庫可以保證代碼在不同操作系統(tǒng)上的兼容性。
多進程讀取、處理和寫入數(shù)據(jù)
更復(fù)雜的場景是多個進程需要讀取數(shù)據(jù)、進行處理,然后將結(jié)果寫回文件。這種情況下,我們需要更精細的鎖控制。
import multiprocessing
import json
from filelock import FileLock
def process_data(process_id, data_file, lock_file):
lock = FileLock(lock_file)
for _ in range(3):
# 讀取數(shù)據(jù)(需要共享鎖)
with lock.acquire(timeout=10):
with open(data_file, "r") as f:
data = json.load(f)
# 處理數(shù)據(jù)(不需要鎖)
processed_value = data["value"] * 2
print(f"進程 {process_id} 處理后的值: {processed_value}")
# 寫入結(jié)果(需要排他鎖)
with lock.acquire(timeout=10):
with open(data_file, "r+") as f:
data = json.load(f)
data["value"] = processed_value
f.seek(0)
json.dump(data, f)
f.truncate()
if __name__ == "__main__":
data_file = "data.json"
lock_file = "data.json.lock"
# 初始化數(shù)據(jù)文件
with open(data_file, "w") as f:
json.dump({"value": 1}, f)
# 創(chuàng)建3個進程
processes = []
for i in range(3):
p = multiprocessing.Process(target=process_data, args=(i, data_file, lock_file))
processes.append(p)
p.start()
# 等待所有進程完成
for p in processes:
p.join()
# 查看最終結(jié)果
with open(data_file, "r") as f:
final_data = json.load(f)
print(f"最終結(jié)果: {final_data}")
這個例子展示了讀寫分離的鎖策略:讀取數(shù)據(jù)時使用共享鎖(允許多個進程同時讀?。?,寫入數(shù)據(jù)時使用排他鎖(確保只有一個進程在寫入)。這種策略可以提高并發(fā)性能,同時保證數(shù)據(jù)一致性。
使用fcntl實現(xiàn)細粒度文件鎖
對于Unix系統(tǒng),我們可以使用fcntl模塊實現(xiàn)更細粒度的文件鎖,允許不同進程操作文件的不同部分。
import multiprocessing
import fcntl
import os
def write_chunk(process_id, file_path, start, length):
with open(file_path, "r+") as f:
# 鎖定指定范圍
fcntl.fcntl(f, fcntl.F_SETLK, fcntl struct.pack('hhllhh', fcntl.F_WRLCK, 0, start, length, 0, 0))
# 寫入數(shù)據(jù)
f.seek(start)
data = f"進程 {process_id} 寫入的內(nèi)容".ljust(length, 'x')
f.write(data)
# 解鎖(可選,文件關(guān)閉時會自動解鎖)
# fcntl.fcntl(f, fcntl.F_SETLK, struct.pack('hhllhh', fcntl.F_UNLCK, 0, start, length, 0, 0))
if __name__ == "__main__":
file_path = "chunked_file.dat"
file_size = 1000 # 1000字節(jié)的文件
# 創(chuàng)建空文件并設(shè)置大小
with open(file_path, "w") as f:
f.write('\0' * file_size)
# 每個進程負責(zé)寫入不同的塊
processes = []
chunk_size = 200
for i in range(5):
start = i * chunk_size
p = multiprocessing.Process(target=write_chunk, args=(i, file_path, start, chunk_size))
processes.append(p)
p.start()
for p in processes:
p.join()
print("所有塊寫入完成")
這個例子中,我們將文件分成5個塊,每個進程負責(zé)寫入一個塊,并只鎖定自己需要操作的部分。這樣,多個進程可以同時操作同一文件的不同部分,大大提高了并發(fā)性能。
文件加鎖的最佳實踐
正確使用文件加鎖需要遵循一些最佳實踐,以確保系統(tǒng)的可靠性、性能和安全性。
最小化鎖持有時間
持有鎖的時間越長,其他進程等待的時間就越長,系統(tǒng)并發(fā)性能就越低。因此,應(yīng)盡量縮短持有鎖的時間:
# 不推薦:長時間持有鎖
with lock:
data = read_data()
result = complex_processing(data) # 耗時操作
write_result(result)
# 推薦:只在必要時持有鎖
data = read_data() # 可能需要讀鎖
result = complex_processing(data) # 不需要鎖
with lock: # 只在寫入時持有鎖
write_result(result)
將耗時的處理操作放在鎖的范圍之外,可以顯著提高系統(tǒng)的并發(fā)能力。
始終確保釋放鎖
未釋放的鎖會導(dǎo)致其他進程永久阻塞,造成死鎖。使用上下文管理器(with語句)是確保鎖被釋放的最佳方式:
# 推薦:使用上下文管理器
with lock:
# 操作文件
# 替代方案:使用try-finally
try:
lock.acquire()
# 操作文件
finally:
lock.release()
上下文管理器會自動處理鎖的釋放,即使在操作過程中發(fā)生異常也不例外。
處理鎖超時
在獲取鎖時設(shè)置合理的超時時間,可以避免進程無限期等待:
from filelock import FileLock, Timeout
lock = FileLock("data.lock")
try:
# 最多等待5秒
with lock.acquire(timeout=5):
# 操作文件
except Timeout:
# 處理獲取鎖失敗的情況
print("無法獲取鎖,操作超時")
合理的超時時間取決于具體應(yīng)用場景,過短可能導(dǎo)致頻繁的超時失敗,過長則可能導(dǎo)致進程長時間無響應(yīng)。
避免死鎖
死鎖是多進程編程中的常見問題,當兩個或多個進程互相等待對方持有的鎖時就會發(fā)生死鎖。例如:
# 進程1
with lock1:
# 操作1
with lock2:
# 操作2
# 進程2
with lock2:
# 操作3
with lock1:
# 操作4
如果進程1持有l(wèi)ock1并等待lock2,而進程2持有l(wèi)ock2并等待lock1,就會發(fā)生死鎖。避免死鎖的方法包括:
- 所有進程按相同的順序獲取鎖
- 避免在持有一個鎖時獲取另一個鎖
- 使用超時機制,在超時后釋放已獲取的鎖
選擇合適的鎖粒度
鎖的粒度選擇需要在安全性和性能之間權(quán)衡:
- 粗粒度鎖(如鎖定整個文件)實現(xiàn)簡單,但并發(fā)性能低
- 細粒度鎖(如字節(jié)范圍鎖)并發(fā)性能高,但實現(xiàn)復(fù)雜,容易出錯
應(yīng)根據(jù)具體需求選擇合適的鎖粒度。例如,對于日志文件,通常使用粗粒度鎖;而對于大型數(shù)據(jù)文件,可能需要使用細粒度鎖。
測試并發(fā)場景
多進程文件操作的問題往往在高并發(fā)場景下才會顯現(xiàn),因此需要進行充分的并發(fā)測試:
import multiprocessing
import time
import tempfile
import os
from filelock import FileLock
def test_operation(lock_file, data_file, result_queue):
try:
lock = FileLock(lock_file)
for _ in range(10):
with lock:
# 讀取當前值
with open(data_file, "r") as f:
value = int(f.read())
# 模擬處理時間
time.sleep(0.001)
# 寫入新值
with open(data_file, "w") as f:
f.write(str(value + 1))
result_queue.put(True)
except Exception as e:
result_queue.put(str(e))
def test_concurrent_access(num_processes=10):
# 創(chuàng)建臨時文件
with tempfile.NamedTemporaryFile(delete=False) as f:
f.write(b"0")
data_file = f.name
lock_file = data_file + ".lock"
result_queue = multiprocessing.Queue()
# 啟動多個進程
processes = []
for _ in range(num_processes):
p = multiprocessing.Process(
target=test_operation,
args=(lock_file, data_file, result_queue)
)
processes.append(p)
p.start()
# 等待所有進程完成
for p in processes:
p.join()
# 檢查結(jié)果
errors = []
for _ in range(num_processes):
result = result_queue.get()
if result is not True:
errors.append(result)
# 檢查最終值
with open(data_file, "r") as f:
final_value = int(f.read())
# 清理臨時文件
os.unlink(data_file)
if os.path.exists(lock_file):
os.unlink(lock_file)
# 輸出測試結(jié)果
print(f"測試完成: {num_processes}個進程,每個進程遞增10次")
print(f"預(yù)期結(jié)果: {num_processes * 10}")
print(f"實際結(jié)果: {final_value}")
if errors:
print(f"錯誤: {len(errors)}個錯誤發(fā)生")
for err in errors:
print(f"- {err}")
else:
print("測試成功,無錯誤發(fā)生")
if __name__ == "__main__":
test_concurrent_access(20)
這個測試程序創(chuàng)建多個進程,每個進程多次遞增一個共享計數(shù)器。如果鎖機制正確,最終結(jié)果應(yīng)該是進程數(shù)乘以每個進程的遞增次數(shù)。通過這種測試可以驗證鎖機制的有效性。
常見問題與解決方案
即使遵循了最佳實踐,在多進程文件加鎖中仍然可能遇到一些問題。下面是一些常見問題及其解決方案。
鎖文件殘留
使用基于文件的鎖機制(如filelock庫)時,如果進程在持有鎖時意外崩潰,可能導(dǎo)致鎖文件殘留,從而阻止其他進程獲取鎖。
解決方案:
- 啟動時檢查并清理殘留的鎖文件:
import os
from filelock import FileLock
lock_file = "data.lock"
# 檢查并清理舊的鎖文件
if os.path.exists(lock_file):
# 嘗試獲取鎖,如果失敗,說明鎖正在被使用
try:
with FileLock(lock_file, timeout=1):
pass # 鎖可以被獲取,說明是殘留文件
os.remove(lock_file)
except Timeout:
pass # 鎖正在被使用,不做處理
# 正常使用鎖
with FileLock(lock_file):
# 操作文件
- 使用帶有超時的鎖,確保即使有殘留鎖文件,系統(tǒng)也能在一定時間后恢復(fù)。
跨平臺兼容性問題
不同操作系統(tǒng)的文件鎖實現(xiàn)存在差異,可能導(dǎo)致代碼在不同平臺上表現(xiàn)不同。
解決方案:
- 使用跨平臺庫(如
filelock)代替平臺特定的API - 為不同平臺編寫條件代碼:
import sys
if sys.platform.startswith('win'):
# Windows平臺代碼
import msvcrt
# ...
else:
# Unix平臺代碼
import fcntl
# ...
- 在多種平臺上進行測試
性能瓶頸
過度使用鎖或持有鎖時間過長會導(dǎo)致性能瓶頸。
解決方案:
- 優(yōu)化鎖的粒度,盡量使用細粒度鎖
- 減少鎖的持有時間
- 采用讀寫分離策略,使用共享鎖進行讀取
- 考慮使用其他同步機制,如消息隊列,減少文件共享需求
網(wǎng)絡(luò)文件系統(tǒng)上的鎖問題
在NFS、SMB等網(wǎng)絡(luò)文件系統(tǒng)上,文件鎖的行為可能不可靠或存在延遲。
解決方案:
- 避免在網(wǎng)絡(luò)文件系統(tǒng)上使用文件鎖
- 如果必須使用,選擇基于文件存在性的鎖機制(如
filelock) - 增加鎖操作的超時時間
- 實現(xiàn)額外的健康檢查機制,處理鎖失效的情況
總結(jié)
多進程文件加鎖是確保并發(fā)環(huán)境下文件操作安全性的關(guān)鍵技術(shù)。本文詳細介紹了Python中的各種文件加鎖機制,包括Unix系統(tǒng)的fcntl模塊、Windows系統(tǒng)的msvcrt模塊,以及跨平臺的filelock庫。通過實際案例,我們展示了如何在多進程環(huán)境中應(yīng)用這些技術(shù),解決日志寫入、數(shù)據(jù)處理等常見場景中的并發(fā)問題。
正確使用文件加鎖需要平衡安全性和性能,遵循最小化鎖持有時間、確保鎖釋放、處理超時等最佳實踐。同時,需要注意避免死鎖、選擇合適的鎖粒度,并進行充分的并發(fā)測試。
在實際開發(fā)中,應(yīng)根據(jù)具體需求和運行環(huán)境選擇合適的鎖機制。對于簡單的跨平臺需求,filelock庫是不錯的選擇;對于需要細粒度控制的Unix系統(tǒng)應(yīng)用,可以考慮fcntl模塊;而Windows系統(tǒng)應(yīng)用則可以使用msvcrt模塊。
到此這篇關(guān)于Python多進程操作文件加鎖的項目實踐的文章就介紹到這了,更多相關(guān)Python多進程加鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中Timedelta轉(zhuǎn)換為Int或Float方式
這篇文章主要介紹了Python中Timedelta轉(zhuǎn)換為Int或Float方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Python基于多線程實現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫的方法
這篇文章主要介紹了Python基于多線程實現(xiàn)抓取數(shù)據(jù)存入數(shù)據(jù)庫的方法,結(jié)合實例形式分析了Python使用數(shù)據(jù)庫類與多線程類進行數(shù)據(jù)抓取與寫入數(shù)據(jù)庫操作的具體使用技巧,需要的朋友可以參考下2018-06-06
教女朋友學(xué)Python(一)運行環(huán)境搭建
這篇文章主要介紹了教女朋友學(xué)Python(一)運行環(huán)境搭建,具有一定借鑒價值,需要的朋友可以參考下。2017-11-11

