AFAIU, блокировка выполняется ядром. Причина, по которой вы видите эффекты блокировки, хотя вы и не просили об этом, заключается в том, что флаг состояния файла O_NONBLOCK
по умолчанию не установлен (я полагаю, что при открытии файла).
Обратитесь к разделу руководства по флагам состояния файла , в частности, см. режимы работы и man 2 fcntl
.
Я исправил ваш пример таким образом, чтобы увидеть эффекты O_NONBLOCK
(и действительно, утверждение сейчас не работает):
--- 1.py.orig 2019-07-05 14:49:13.276289018 +0300
+++ 1.py 2019-07-05 14:51:11.674727731 +0300
@@ -1,5 +1,7 @@
import multiprocessing
import random
+import os
+import fcntl
NUM_WORKERS = 10
LINE_SIZE = 10000
@@ -8,6 +10,8 @@
def writer(i):
line = ("%d " % i) * LINE_SIZE + "\n"
with open("file.txt", "a") as file:
+ flag = fcntl.fcntl(file.fileno(), fcntl.F_GETFD)
+ fcntl.fcntl(file.fileno(), fcntl.F_SETFL, flag | os.O_NONBLOCK)
for _ in range(NUM_LINES):
file.write(line)
Кредит: см., Например, это и это (и / или man 3p write
).