我有一个程序可以读取一些输入文本文件并将它们全部写入名为ListOutput
的列表中,这是我程序中使用的两个进程之间的共享内存(我使用了两个进程,所以我的程序运行得更快! )我还有一个名为processedFiles
的共享内存变量,它存储任何进程已读取的输入文件的名称,因此当前进程不再读取它们!
要确保两个进程不同时检查“processedFiles”(例如,在开头,它们可能同时得出“processedFiles”的结论因此,他们读取相同的文件,因此,我在Lock
的检查部分周围添加了一个processedFiles
,因此一个进程应该完成并释放锁定的部分,然后另一个进程检入该部分! / p>
我的问题是Lock
函数似乎不起作用,当我在锁定部分内打印当前ProcessName
时,它表明两个进程都在锁定部分内。我无法弄清楚我的代码有什么问题? (见下面的输出。)
由于我的主程序不仅仅是读取输入文本文件并在列表中打印它们,而且在将它们打印到列表中之前必须对输入文件执行非常复杂的操作,我应该使用{ {1}}代替Pool
以及为什么?
代码:
Process
我有4个名为import glob
from multiprocessing import Process, Manager
from threading import *
import timeit
import os
os.chdir("files")
def print_content(ProcessName,processedFiles,ListOutput,lock):
for file in glob.glob("*.txt"):
newfile=0
lock.acquire()
print "\n Current Process:",ProcessName
if file not in processedFiles:
print "\n", file, " not in ", processedFiles," for ",ProcessName
processedFiles.append(file)
newfile=1#it is a new file
lock.release()
#if it is a new file
if newfile==1:
f = open(file,"r")
lines = f.readlines()
ListOutput.append(lines)
f.close()
# Create two processes as follows
try:
manager = Manager()
processedFiles = manager.list()
ListOutput = manager.list()
lock=Lock()
p1 = Process(target=print_content, args=("Procees-1",processedFiles,ListOutput,lock))
p2 = Process(target=print_content, args=("Process-2",processedFiles,ListOutput,lock))
p1.start()
p2.start()
p1.join()
p2.join()
print "ListOutput",ListOutput
except:
print "Error: unable to start process"
的输入文件(包含“我的车”),1.txt
(包含“您的车”),2.txt
(包含“我的书”),{{ 1}}(包含“你的书”)。
它显示的输出在不同的运行中发生变化。这是其中一个运行中的输出:
3.txt
答案 0 :(得分:1)
宾果!谢谢你包括进口。 现在问题很明显; - )
您需要使用multiprocessing.Lock
来获取跨进程的锁。您实际使用的Lock
是通过您的
from threading import *
threading.Lock
对您的目的毫无用处:它对跨进程没有任何影响;它只在单个进程中的线程中提供排除。
使用import *
通常是一个坏主意,这就是原因之一。即使您将第二次导入更改为
from multiprocessing import Process, Manager, Lock
^^^^
它对你没有任何好处,因为from threading import *
会覆盖你真正想要的Lock
。