2024-04-24 00:50:04 发布
网友
我是python编程新手。我需要写一个脚本,将执行3个新创建的进程在不同的时间,但非常密切。资源始终需要检查文件是否被锁定,因为执行python脚本的第一个进程将执行一个命令,并锁定一个文件以将命令的结果写入其中。 而其他两个进程将等待文件解锁,以便读取结果id并执行与第一个进程不同的命令。你知道吗
我怎么能用python实现呢? 谢谢
您可以使用:
os.open("lockfile", os.O_CREAT | os.O_EXCL)
创建表示锁的文件。以这种方式使用open,如果文件已经存在,则调用将失败,并且可以保证,如果创建了文件并且调用成功,则没有其他进程也能够创建该文件。这就提供了一个由这个文件表示的锁定机制。成功创建文件的过程意味着您获得了锁。要放弃锁定,请删除该文件。你知道吗
其他进程可以检查文件是否存在,以知道某个进程有锁。如果文件不存在,则没有进程具有锁。听起来您可能会让进程监视这种情况,然后继续,因为写入进程已经完成了写入,因为它已经放弃了锁。你知道吗
请注意,这个锁文件可以是您实际想要写入的文件,但不一定是。您可以使用一个单独的文件来处理锁定,获得锁定的进程可以知道它可以安全地写入一个或多个其他文件,而不需要其他进程也尝试写入它们。你知道吗
如果我没有误解的话,这个任务可以通过使用Lock来获得写访问权,使用Semaphore来通知进程,在没有获得写锁的情况下,进程将要读取文件,最后使用Barrier来重新对齐进程。 举个例子:
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
您可以使用:
创建表示锁的文件。以这种方式使用open,如果文件已经存在,则调用将失败,并且可以保证,如果创建了文件并且调用成功,则没有其他进程也能够创建该文件。这就提供了一个由这个文件表示的锁定机制。成功创建文件的过程意味着您获得了锁。要放弃锁定,请删除该文件。你知道吗
其他进程可以检查文件是否存在,以知道某个进程有锁。如果文件不存在,则没有进程具有锁。听起来您可能会让进程监视这种情况,然后继续,因为写入进程已经完成了写入,因为它已经放弃了锁。你知道吗
请注意,这个锁文件可以是您实际想要写入的文件,但不一定是。您可以使用一个单独的文件来处理锁定,获得锁定的进程可以知道它可以安全地写入一个或多个其他文件,而不需要其他进程也尝试写入它们。你知道吗
如果我没有误解的话,这个任务可以通过使用Lock来获得写访问权,使用Semaphore来通知进程,在没有获得写锁的情况下,进程将要读取文件,最后使用Barrier来重新对齐进程。 举个例子:
输入示例:
相关问题 更多 >
编程相关推荐