Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅当没有其他';过程';他正在做这件事_Python_Python 2.7_File - Fatal编程技术网

Python 仅当没有其他';过程';他正在做这件事

Python 仅当没有其他';过程';他正在做这件事,python,python-2.7,file,Python,Python 2.7,File,我想打开3个Powershell并在其中3个上运行相同的代码,只是不同的文件。 因为他们的逻辑完全相同,所以他们每个人都会尝试访问彼此的文件,以检查是否有任何内容写入其中 Process1有client1.txt,Process2有client2.txt,Process3有client3.txt 下面是一些代码,说明在选择要处理的问题之前,流程3应该检查哪些问题: import os while True: f = 'C:\Users\Files' i = {} i['word'] = 'pro

我想打开3个Powershell并在其中3个上运行相同的代码,只是不同的文件。
因为他们的逻辑完全相同,所以他们每个人都会尝试访问彼此的文件,以检查是否有任何内容写入其中
Process1有client1.txt,Process2有client2.txt,Process3有client3.txt
下面是一些代码,说明在选择要处理的问题之前,流程3应该检查哪些问题:

import os
while True:
f = 'C:\Users\Files'
i = {}
i['word'] = 'problem X' #just an example, I'll have a whole list
if os.path.exists(f):
    try:
        os.rename(f, f)
        print 'Access on file "' + f +'" is available!'
        file1 = open('C:\Users\Files\client1.txt', 'r+')
        file2 = open('C:\Users\Files\client2.txt', 'r+')
        if file1.read() == i['word']:
            print "A process is already working on this problem, check another"
        elif file2.read() == i['word']:
            print "A process is already working on this problem, check another"
        else:
            print "Found a new problem to work on"
            file3 = open('C:\Users\Files\client3.txt', 'r+')
            file3.write(i['word'])
            file1.close()
            file2.close()
            file3.close()

    except OSError as e:
        print 'Access-error on file "' + f + '"! \n' + str(e)
        time.sleep(5)
        pass
我试图通过代码来表示的是:我只想在其他人还没有解决问题的情况下启动一个流程,因为他们都有相同的逻辑,他们将尝试解决相同的问题(我有很多问题需要解决),因此他们可能会在程序继续执行
的同时到达,而True

完成问题后,它将删除文件内容并选择一个新问题,然后将正在处理的问题写入自己的文件中,供其他人稍后检查

只是想说清楚一点:假设process1首先发现了一个要工作的问题(“AAA”),它们都有空的txt文件,它将检查txt2和txt3,发现它不等于(“AAA”),然后将其写入自己的文件并关闭。
我想要process2,它可能会在一秒钟后读取txt1和txt3,并查看('AAA')是否已经在工作,它将在列表中找到下一个并再次检查,查看('BBB')是否正常,并将写入自己的文件。
当它结束时,它从txt中删除该字符串并开始寻找另一个字符串


两个进程同时尝试检查文件也存在问题。如果另一个进程正在使用该文件,可能有一种方法可以将
time.sleep()
放入一个进程,然后稍后再试?

理想情况下,您可以使用Python的模块启动每个进程。您可以用一个进程监视新文件,并将它们提供给工作进程从中读取的进程。此解决方案将消除任何文件锁定的需要,因为只有一个进程在查找新文件

但是,如果必须通过powershell启动进程,则必须使用某种类型的锁定来使进程协同工作。真正的文件锁定很难以跨平台的方式实现。你可以通过移动来伪装它。例如,您可以尝试移动文件(在大多数操作系统上,移动是原子的,假设您要移动到同一文件系统上的某个位置)。如果移动失败,您知道必须有另一个进程先到达,否则操作系统会出现严重问题。然后可以对移动的文件执行所有处理。例如:

import path
import shutil

filename = "C:\\path\\to\\filename.txt"
_filename = os.path.join(os.path.basename(filename), ".wip")
wip_filename = os.path.join(os.path.dirname(filename), _filename)

try:
    shutil.move(filename, wip_filename)
except OSError:
    # another process moved it first
    pass
else:
    do_work(wip_filename) 

理想情况下,您可以使用Python的模块来启动每个进程。您可以用一个进程监视新文件,并将它们提供给工作进程从中读取的进程。此解决方案将消除任何文件锁定的需要,因为只有一个进程在查找新文件

但是,如果必须通过powershell启动进程,则必须使用某种类型的锁定来使进程协同工作。真正的文件锁定很难以跨平台的方式实现。你可以通过移动来伪装它。例如,您可以尝试移动文件(在大多数操作系统上,移动是原子的,假设您要移动到同一文件系统上的某个位置)。如果移动失败,您知道必须有另一个进程先到达,否则操作系统会出现严重问题。然后可以对移动的文件执行所有处理。例如:

import path
import shutil

filename = "C:\\path\\to\\filename.txt"
_filename = os.path.join(os.path.basename(filename), ".wip")
wip_filename = os.path.join(os.path.dirname(filename), _filename)

try:
    shutil.move(filename, wip_filename)
except OSError:
    # another process moved it first
    pass
else:
    do_work(wip_filename) 

不是重复的,但可能相关:@paisanco我只了解一般的想法,因为我对python还不熟悉,但它真的很有趣。你认为他们提到的块也是我想要的那种进程,还是仅仅是线程/多进程和有“链接”的东西?不是重复的,但可能是相关的:@paisanco我只理解一般的想法,因为我对python不熟悉,但它真的很有趣。你认为他们提到的块也是我想要的那种进程,还是仅仅是线程/多进程和有“链接”的东西?你实际上向我解释了我自己的一些代码,我以前不理解。我想这是没办法的,我不会再害怕多重处理和排队了。谢谢你向我解释了我自己的一些代码,我以前不懂。我想这是没办法的,我不会再害怕多重处理和排队了。谢谢