多处理锁()不起作用

Mah*_* Ra 0 python multithreading multiprocessing

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

  1. 确保两个进程不会同时检查“processedFiles”(例如在开始时,它们可能同时得出“processedFiles”为空的结论,因此它们读取相同文件),因此,我Lock在检查部分周围添加了一个,processedFiles以便一个进程应该在另一个进程签入该部分之前完成并释放锁定的部分!

    我的问题是该Lock功能似乎不起作用,当我ProcessName在锁定部分内打印电流时,它表明两个进程都在锁定部分内。我不知道我的代码有什么问题?(请参阅下面的输出。)

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

代码:

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"
Run Code Online (Sandbox Code Playgroud)

我有 4 个名为1.txt(包含“我的车”)、2.txt(包含“你的车”)、3.txt(包含“我的书”)、4.txt(包含“你的书”)的输入文件。它向我显示的输出在不同的运行中会发生变化。这是其中一次运行的输出:

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"
Run Code Online (Sandbox Code Playgroud)

Tim*_*ers 5

答对了!感谢您包括进口。 现在问题很明显;-)

您需要使用 amultiprocessing.Lock来获取跨进程工作的锁。在Lock你实际使用隐式地通过其他的东西山获得沿着你

from threading import *
Run Code Online (Sandbox Code Playgroud)

一个threading.Lock是无用的,你的目的:它没有任何作用流程; 它只提供单个进程线程之间的排除。

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

from multiprocessing import Process, Manager, Lock
                                              ^^^^
Run Code Online (Sandbox Code Playgroud)

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