Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 3.x_Multithreading_Multiprocessing - Fatal编程技术网

通过写入python文件跟踪多处理中的事件状态

通过写入python文件跟踪多处理中的事件状态,python,python-3.x,multithreading,multiprocessing,Python,Python 3.x,Multithreading,Multiprocessing,我正在处理一个需要用python进行多处理的任务,我需要通过将已处理的文档ID写入一个文件(进程之间共享的单个文件)来跟踪状态 我使用下面的代码片段实现了一个简单的版本。在代码中,我将一些ID存储在一个名为question的变量中,该变量是共享文件f,在main方法中,我将question拆分为可以并行处理的可能块 这样做对吗 from multiprocessing import Pool from multiprocessing import Queue def reader(val):

我正在处理一个需要用python进行多处理的任务,我需要通过将已处理的文档ID写入一个文件(进程之间共享的单个文件)来跟踪状态

我使用下面的代码片段实现了一个简单的版本。在代码中,我将一些ID存储在一个名为
question
的变量中,该变量是共享文件
f
,在main方法中,我将
question
拆分为可以并行处理的可能块

这样做对吗

from multiprocessing import Pool
from multiprocessing import Queue

def reader(val):
  pqueue.put(val)

def writer():
  a = pqueue.get()
  f = open("num.txt",'a')
  f.write(str(a))
  f.write("\n")
  f.close()
  

def main():
  
  global question
  global pqueue
  pqueue = Queue() # writer() writes to pqueue from _this_ process

  
  processes = []
  question = [16,0,1,2,3,4,5,6,7,8,10,11,12,13,14,15]
  cores=5
  loww=0
  chunksize = int((len(question)-loww)/cores)
  splits = []
  for i in range(cores):
    splits.append(loww+1+((i)*chunksize))
  splits.append(len(question)+1)
  print(splits)
  args = []
  for i in range(cores):
    a=[]
    arguments = (i, splits[i], splits[i+1])
    a.append(arguments)
    args.append(a)
  print(args)
  p = Pool(cores)
  p.map(call_process, args)
  p.close()
  p.join

def call_process(args):
  lower=args[0][1]
  upper=args[0][2]
  for x in range(lower,upper):
    a = question[x-1]
    try:
      pass
    except:
      continue
    #write item to file
    print(f,'a = ',a)
    reader(a)
    writer()
    


main()

注意:代码似乎不起作用。

迟早会有一个进程试图打开一个文件,而另一个进程正在向该文件写入数据,然后事情就会破裂

相反,我的策略是:

  • 启动一个进程,调用这个“编年史器”,它监视一个队列中输入的比特和片段,每次有东西进来时,都会写入文件

  • 启动工人。每次工作人员完成时,将一些位和块推到前面提到的队列中。然后继续执行下一个任务(从而将所有文件打开写入和关闭过程交给“编年史记录程序”)

  • 让他们都监视一个叫做“停止和停止”的事件。主进程可以设置()此事件,而子进程在看到事件已设置时,会优雅地结束自己


  • 如果您仍在使用python 2.7,
    print()
    在2.7中是无效的,除非您从
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    导入,否则我使用的是python3.6为什么要用python2.7标记?我删除了Ta。这和你的解释很接近吗?@JesujobaALABI不,甚至不接近。再读一遍我的步骤。注意我在步骤中输入的每一个单词。我不确定我是否完全理解(3)@JesujobaALABI(3)是可选的,只是一种提供优雅关闭子进程的方法。解决方案的要点是(1)和(2)。