Saya perlu mengunci file untuk menulis dengan Python. Ini akan diakses dari beberapa proses Python sekaligus. Saya telah menemukan beberapa solusi online, tetapi sebagian besar gagal untuk tujuan saya karena seringkali hanya berbasis Unix atau berbasis Windows.
python
file-locking
Evan Fosmark
sumber
sumber
Ada modul penguncian file lintas-platform di sini: Portalocker
Meskipun seperti kata Kevin, menulis ke file dari berbagai proses sekaligus adalah sesuatu yang ingin Anda hindari jika memungkinkan.
Jika Anda dapat memperbaiki masalah Anda ke dalam database, Anda bisa menggunakan SQLite. Ini mendukung akses bersamaan dan menangani pengunciannya sendiri.
sumber
Solusi lain mengutip banyak basis kode eksternal. Jika Anda lebih suka melakukannya sendiri, berikut adalah beberapa kode untuk solusi lintas-platform yang menggunakan masing-masing alat penguncian file pada sistem Linux / DOS.
Sekarang,
AtomicOpen
dapat digunakan diwith
blok di mana orang biasanya menggunakanopen
pernyataan.PERINGATAN: Jika berjalan pada Windows dan Python crash sebelum keluar dipanggil, saya tidak yakin apa perilaku kunci itu.
PERINGATAN: Penguncian yang disediakan di sini adalah saran, bukan mutlak. Semua proses yang berpotensi bersaing harus menggunakan kelas "AtomicOpen".
sumber
unlock_file
File di linux tidak boleh meneleponfcntl
lagi denganLOCK_UN
bendera?__exit__
kamu diclose
luar kunci setelahunlock_file
. Saya percaya runtime bisa menyiram (yaitu, menulis) data selamaclose
. Saya percaya seseorang harusflush
dan difsync
bawah kunci untuk memastikan tidak ada data tambahan yang ditulis di luar kunci selamaclose
.flush
danfsync
. Saya telah menambahkan dua baris yang Anda sarankan sebelum meneleponunlock
. Saya diuji ulang dan kondisi balapan tampaknya teratasi.Saya lebih suka lockfile - Penguncian file yang bebas platform
sumber
Saya telah mencari beberapa solusi untuk melakukan itu dan pilihan saya adalah oslo.concurrency
Ini kuat dan relatif terdokumentasi dengan baik. Ini didasarkan pada pengencang.
Solusi lain:
sumber
filelock
(Terakhir dirilis: 18 Mei 2019 pada saat komentar)Mengunci adalah platform dan perangkat khusus, tetapi secara umum, Anda memiliki beberapa opsi:
Untuk semua metode ini, Anda harus menggunakan teknik spin-lock (coba-setelah-kegagalan) untuk mendapatkan dan menguji kunci. Ini meninggalkan jendela kecil untuk kesalahan sinkronisasi, tetapi umumnya cukup kecil untuk tidak menjadi masalah besar.
Jika Anda mencari solusi yang lintas platform, maka Anda lebih baik masuk ke sistem lain melalui beberapa mekanisme lain (hal terbaik berikutnya adalah teknik NFS di atas).
Perhatikan bahwa sqlite tunduk pada batasan yang sama pada NFS dengan file normal, jadi Anda tidak dapat menulis ke database sqlite pada jaringan berbagi dan mendapatkan sinkronisasi secara gratis.
sumber
os.rename
sekarang menjadi atom di Win32 sejak Python 3.3: bugs.python.org/issue8828Mengoordinasikan akses ke satu file pada level OS penuh dengan segala macam masalah yang mungkin tidak ingin Anda selesaikan.
Taruhan terbaik Anda adalah memiliki proses terpisah yang mengoordinasikan akses baca / tulis ke file itu.
sumber
flock
untuk itu. Pendekatan "gulung mutex Anda sendiri dan proses daemon untuk mengelolanya" tampaknya merupakan pendekatan yang agak ekstrem dan rumit untuk menyelesaikan ... masalah yang belum Anda sampaikan kepada kami, tetapi hanya menyarankan untuk mencari yang ada.Mengunci file biasanya operasi platform-spesifik, jadi Anda mungkin perlu untuk memungkinkan kemungkinan berjalan pada sistem operasi yang berbeda. Sebagai contoh:
sumber
Saya telah bekerja pada situasi seperti ini di mana saya menjalankan banyak salinan dari program yang sama dari dalam direktori / folder yang sama dan kesalahan logging. Pendekatan saya adalah menulis "file kunci" ke disk sebelum membuka file log. Program memeriksa keberadaan "file kunci" sebelum melanjutkan, dan menunggu gilirannya jika "file kunci" ada.
Ini kodenya:
Sunting --- Setelah memikirkan beberapa komentar tentang kunci basi di atas saya mengedit kode untuk menambahkan cek untuk staleness dari "file kunci." Waktu beberapa ribu iterasi fungsi ini pada sistem saya memberi dan rata-rata 0,002066 ... detik dari sebelum:
hanya setelah:
jadi saya pikir saya akan mulai dengan 5 kali jumlah itu untuk menunjukkan staleness dan memonitor situasi untuk masalah.
Juga, ketika saya sedang mengerjakan pengaturan waktu, saya menyadari bahwa saya memiliki sedikit kode yang tidak terlalu diperlukan:
yang saya segera ikuti pernyataan terbuka, jadi saya telah menghapusnya di edit ini.
sumber
Untuk menambahkan jawaban Evan Fossmark , berikut adalah contoh cara menggunakan filelock :
Kode apa pun di dalam
with lock:
blok adalah thread-safe, artinya kode itu akan selesai sebelum proses lain memiliki akses ke file.sumber
The skenario seperti itu: Pengguna meminta file untuk melakukan sesuatu. Kemudian, jika pengguna mengirim permintaan yang sama lagi, itu memberi tahu pengguna bahwa permintaan kedua tidak dilakukan sampai permintaan pertama selesai. Itu sebabnya, saya menggunakan mekanisme kunci untuk menangani masalah ini.
Ini kode kerja saya:
sumber
Saya menemukan implementasi (!) Yang sederhana dan berhasil dari grizzled-python.
Penggunaan sederhana os.open (..., O_EXCL) + os.close () tidak berfungsi di windows.
sumber
Anda mungkin menemukan pylocker sangat berguna. Ini dapat digunakan untuk mengunci file atau untuk mekanisme penguncian secara umum dan dapat diakses dari beberapa proses Python sekaligus.
Jika Anda hanya ingin mengunci file, inilah cara kerjanya:
sumber