MultiProcessing Lock()不起作用

时间:2016-10-08 00:17:55

标签: python multithreading multiprocessing

我有一个程序可以读取一些输入文本文件并将它们全部写入名为ListOutput的列表中,这是我程序中使用的两个进程之间的共享内存(我使用了两个进程,所以我的程序运行得更快! )我还有一个名为processedFiles的共享内存变量,它存储任何进程已读取的输入文件的名称,因此当前进程不再读取它们!

  1. 要确保两个进程不同时检查“processedFiles”(例如,在开头,它们可能同时得出“processedFiles”的结论因此,他们读取相同的文件,因此,我在Lock的检查部分周围添加了一个processedFiles,因此一个进程应该完成并释放锁定的部分,然后另一个进程检入该部分! / p>

    我的问题是Lock函数似乎不起作用,当我在锁定部分内打印当前ProcessName时,它表明两个进程都在锁定部分内。我无法弄清楚我的代码有什么问题? (见下面的输出。)

  2. 由于我的主程序不仅仅是读取输入文本文件并在列表中打印它们,而且在将它们打印到列表中之前必须对输入文件执行非常复杂的操作,我应该使用{ {1}}代替Pool以及为什么?

  3. 代码:

    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

1 个答案:

答案 0 :(得分:1)

宾果!谢谢你包括进口。 现在问题很明显; - )

您需要使用multiprocessing.Lock来获取跨进程的锁。您实际使用的Lock是通过您的

隐式获得的
from threading import *

threading.Lock对您的目的毫无用处:它对进程没有任何影响;它只在单个进程中的线程中提供排除。

使用import *通常是一个坏主意,这就是原因之一。即使您将第二次导入更改为

from multiprocessing import Process, Manager, Lock
                                              ^^^^

它对你没有任何好处,因为from threading import *会覆盖你真正想要的Lock