我是新的python编程。我需要写一个脚本,将由3个新创建的进程在不同的时间执行,但非常接近。在任何时候,资源需要检查一个文件是否被锁定,因为第一个进程执行python脚本,将执行一个命令,并锁定文件以将命令的结果写入其中。而其他2个进程将等待文件被解锁以读取结果ID并执行与第一个不同的命令。我如何在python中实现这一点?谢谢
vi4fp9gy1#
如果我没有误解的话,这个任务可以通过使用一个锁来获得写访问权限,一个信号量来通知进程,如果没有获得写锁,将希望读取文件,最后一个屏障来重新调整进程来完成。
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
lf3rwulv2#
您可以使用:
os.open("lockfile", os.O_CREAT | os.O_EXCL)
创建一个表示锁的文件。这样使用open,如果文件已经存在,调用将失败,并且可以保证如果文件被创建并且调用成功,则没有其他进程也能够创建该文件。所以这给了你一个由该文件表示的锁定机制。成功创建文件的进程意味着你获得了锁。要放弃锁,你就删除这个文件。其他进程可以检查文件是否存在,以确定某个进程拥有锁。如果文件不存在,则没有进程拥有锁。听起来可能您会让进程监视这种情况,然后继续进行,因为写入进程已经放弃锁,所以它已经完成写入。注意这个锁文件可以是你真正想要写入的文件,但也不是必须的。你可以使用一个单独的文件来处理锁,并且获得锁的进程可以知道它可以安全地写入一个或多个其他文件,而没有其他进程也试图写入它们。
g2ieeal73#
唉,我不得不使用文件锁定,因为进程方法不起作用。而且我实际上有5个独立的应用程序在运行。
def lock(article): lockfile = os.path.join(lock_folder, article) os.open(lockfile, os.O_CREAT | os.O_EXCL) return def unlock(article): lockfile = os.path.join(lock_folder, article) os.remove(lockfile) return
然后使用它
try: try: lock(article) except FileExistsError as e: print('locked. skipping...') return DO_SOMETHING() finally: unlock(article)
现在在我的实现中,我没有try-finally。如果发生错误,我希望文件锁定为rmain,这样我就有办法返回并查找问题
3条答案
按热度按时间vi4fp9gy1#
如果我没有误解的话,这个任务可以通过使用一个锁来获得写访问权限,一个信号量来通知进程,如果没有获得写锁,将希望读取文件,最后一个屏障来重新调整进程来完成。
示例输出:
lf3rwulv2#
您可以使用:
创建一个表示锁的文件。这样使用open,如果文件已经存在,调用将失败,并且可以保证如果文件被创建并且调用成功,则没有其他进程也能够创建该文件。所以这给了你一个由该文件表示的锁定机制。成功创建文件的进程意味着你获得了锁。要放弃锁,你就删除这个文件。
其他进程可以检查文件是否存在,以确定某个进程拥有锁。如果文件不存在,则没有进程拥有锁。听起来可能您会让进程监视这种情况,然后继续进行,因为写入进程已经放弃锁,所以它已经完成写入。
注意这个锁文件可以是你真正想要写入的文件,但也不是必须的。你可以使用一个单独的文件来处理锁,并且获得锁的进程可以知道它可以安全地写入一个或多个其他文件,而没有其他进程也试图写入它们。
g2ieeal73#
唉,我不得不使用文件锁定,因为进程方法不起作用。而且我实际上有5个独立的应用程序在运行。
然后使用它
现在在我的实现中,我没有try-finally。如果发生错误,我希望文件锁定为rmain,这样我就有办法返回并查找问题