用于在3个进程之间写入(+锁定)/读取文件的Python脚本

用于在3个进程之间写入(+锁定)/读取文件的Python脚本,python,Python,我是python编程新手。我需要写一个脚本,将由3个新创建的进程在不同的时间执行,但非常接近。资源始终需要检查文件是否被锁定,因为执行python脚本的第一个进程将执行一个命令,并锁定一个文件以将命令的结果写入其中。 而其他两个进程将等待文件解锁,以便读取结果id并执行与第一个进程不同的命令 我如何在python中实现这一点? 谢谢您可以使用: os.open("lockfile", os.O_CREAT | os.O_EXCL) 创建表示锁的文件。以这种方式使用open,如果文件已经存在,调

我是python编程新手。我需要写一个脚本,将由3个新创建的进程在不同的时间执行,但非常接近。资源始终需要检查文件是否被锁定,因为执行python脚本的第一个进程将执行一个命令,并锁定一个文件以将命令的结果写入其中。 而其他两个进程将等待文件解锁,以便读取结果id并执行与第一个进程不同的命令

我如何在python中实现这一点? 谢谢

您可以使用:

os.open("lockfile", os.O_CREAT | os.O_EXCL)
创建表示锁的文件。以这种方式使用open,如果文件已经存在,调用将失败,并且可以保证,如果创建了文件并且调用成功,则其他进程也无法创建该文件。因此,这为您提供了一个由该文件表示的锁定机制。成功创建文件的过程意味着您获得了锁。要放弃锁定,请删除该文件

其他进程可以检查文件是否存在,以知道某个进程具有锁。如果文件不存在,则没有进程具有锁。听起来您可能会让进程监视这种情况,然后继续编写,因为它已经放弃了锁,所以编写进程已经完成了编写

请注意,此锁定文件可以是您实际想要写入的文件,但不一定是。您可以使用单独的文件来处理锁定,获得锁定的进程可以知道它可以安全地写入一个或多个其他文件,而无需其他进程也尝试写入它们。

您可以使用:

os.open("lockfile", os.O_CREAT | os.O_EXCL)
创建表示锁的文件。以这种方式使用open,如果文件已经存在,调用将失败,并且可以保证,如果创建了文件并且调用成功,则其他进程也无法创建该文件。因此,这为您提供了一个由该文件表示的锁定机制。成功创建文件的过程意味着您获得了锁。要放弃锁定,请删除该文件

其他进程可以检查文件是否存在,以知道某个进程具有锁。如果文件不存在,则没有进程具有锁。听起来您可能会让进程监视这种情况,然后继续编写,因为它已经放弃了锁,所以编写进程已经完成了编写


请注意,此锁定文件可以是您实际想要写入的文件,但不一定是。您可以使用一个单独的文件来处理锁定,获得锁定的进程可以知道它可以安全地写入一个或多个其他文件,而无需其他进程也尝试写入这些文件。

如果我没有误解,可以通过使用a获得写入访问权,a通知进程来完成任务,未能获得写锁定后,将希望读取文件,并最终重新对齐进程。 例如:

import multiprocessing as mp
import time
from random import randint


def fun(lock_w, sem_r, barrier, task, filename):
  me = mp.current_process()
  for i in range(3):
    time.sleep(randint(1, 4))
    if(lock_w.acquire(block=False)):
      print(me.pid, "write access")
      task()
      sem_r.release()
      sem_r.release()
    else:
      sem_r.acquire()
      print(me.pid, "read access")
      task()
    if barrier.wait() == 0:
      print(me.pid, "releasing Lock")
      lock_w.release()

def task1():
  print("\tPerform Task 1")

def task2():
  print("\tPerform Task 2")

def task3():
  print("\tPerform Task 3")

lock_w = mp.Lock()
sem_r = mp.Semaphore(0)
bar = mp.Barrier(3)
t1 = mp.Process(target=fun, args=(lock_w, sem_r, bar, task1, "foo.txt", ))
t2 = mp.Process(target=fun, args=(lock_w, sem_r, bar, task2, "foo.txt", ))
t3 = mp.Process(target=fun, args=(lock_w, sem_r, bar, task3, "foo.txt", ))
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
举例说明:

585 write access
    Perform Task 1
586 read access
    Perform Task 2
587 read access
    Perform Task 3
585 releasing Lock
587 write access
    Perform Task 3
586 read access
    Perform Task 2
585 read access
    Perform Task 1
587 releasing Lock
586 write access
    Perform Task 2
585 read access
    Perform Task 1
587 read access
    Perform Task 3
586 releasing Lock

如果我没有误解的话,可以通过使用a来获得写访问权,a通知进程,如果无法获得写锁定,则需要读取文件,最后a重新对齐进程来完成任务。 例如:

import multiprocessing as mp
import time
from random import randint


def fun(lock_w, sem_r, barrier, task, filename):
  me = mp.current_process()
  for i in range(3):
    time.sleep(randint(1, 4))
    if(lock_w.acquire(block=False)):
      print(me.pid, "write access")
      task()
      sem_r.release()
      sem_r.release()
    else:
      sem_r.acquire()
      print(me.pid, "read access")
      task()
    if barrier.wait() == 0:
      print(me.pid, "releasing Lock")
      lock_w.release()

def task1():
  print("\tPerform Task 1")

def task2():
  print("\tPerform Task 2")

def task3():
  print("\tPerform Task 3")

lock_w = mp.Lock()
sem_r = mp.Semaphore(0)
bar = mp.Barrier(3)
t1 = mp.Process(target=fun, args=(lock_w, sem_r, bar, task1, "foo.txt", ))
t2 = mp.Process(target=fun, args=(lock_w, sem_r, bar, task2, "foo.txt", ))
t3 = mp.Process(target=fun, args=(lock_w, sem_r, bar, task3, "foo.txt", ))
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
举例说明:

585 write access
    Perform Task 1
586 read access
    Perform Task 2
587 read access
    Perform Task 3
585 releasing Lock
587 write access
    Perform Task 3
586 read access
    Perform Task 2
585 read access
    Perform Task 1
587 releasing Lock
586 write access
    Perform Task 2
585 read access
    Perform Task 1
587 read access
    Perform Task 3
586 releasing Lock

我试过你的脚本,但我得到的是:文件testlock.py,第34行,在bar=mp.Barrier3 AttributeError中:“module”对象没有属性“Barrier”,你知道为什么吗?非常感谢您使用哪种python版本?您是对的,这取决于python版本,因为当我使用python 3.6运行脚本时,它可以工作,但不适用于2.7。谢谢,我试过你的脚本,但我得到的是:文件testlock.py,第34行,在bar=mp.Barrier3 AttributeError中:“module”对象没有属性“Barrier”,你知道为什么吗?非常感谢您使用哪种python版本?您是对的,这取决于python版本,因为当我使用python 3.6运行脚本时,它可以工作,但不适用于2.7。谢谢