Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Locking_Multiprocessing_Critical Section - Fatal编程技术网

使用多个进程在Python中写入文件

使用多个进程在Python中写入文件,python,multithreading,locking,multiprocessing,critical-section,Python,Multithreading,Locking,Multiprocessing,Critical Section,我一直在探索python中的多处理器编程,以及它与多线程的区别,我的疑问是关于写入文件。下面是我发现的,对于下面的代码,没有任何内容写入文件,我认为这是因为打开的文件处理程序没有在进程之间共享 import multiprocessing import sys import datetime import time def worker(fd, index): fd.write("worker %d %s\n" % (index, datetime.datetime.now()))

我一直在探索python中的多处理器编程,以及它与多线程的区别,我的疑问是关于写入文件。下面是我发现的,对于下面的代码,没有任何内容写入文件,我认为这是因为打开的文件处理程序没有在进程之间共享

import multiprocessing
import sys
import datetime
import time


def worker(fd, index):
  fd.write("worker %d %s\n" % (index, datetime.datetime.now()))
  time.sleep(5 - index)
  fd.write("worker %d again %s\n" % (index, datetime.datetime.now()))

if __name__ == '__main__':
  fd = open(sys.argv[1], "w")
  threads = list()
  for i in xrange(5):
    th = multiprocessing.Process(target=worker, args=(fd, i,))
    threads.append(th)
    th.start()

  for each in threads:
    each.join()

  fd.close()
由于线程之间共享内存,下面的代码工作正常

import threading
import sys
import datetime


def worker(fd, index):
  fd.write("worker %d %s\n" % (index, datetime.datetime.now()))
  time.sleep(5 - index)
  fd.write("worker %d again %s\n" % (index, datetime.datetime.now()))

if __name__ == '__main__':
  fd = open(sys.argv[1], "w")
  threads = list()
  for i in xrange(5):
    th = threading.Thread(target=worker, args=(fd, i,))
    threads.append(th)
    th.start()

  for each in threads:
    each.join()

  fd.close()
我想使用多个进程而不是线程来写入同一个文件,所以我实现了以下内容。我假设我可能必须使用锁来限制不同进程对文件的访问,但是如果没有锁,下面的内容似乎可以正常工作

import multiprocessing
import sys
import datetime
import time


def write_to_file(text, file_name):
  fd = open(file_name, "a")
  fd.write(text)
  fd.close()


def worker(file_name, index):
  while True:
    write_to_file("worker %d %s\n" % (index, datetime.datetime.now()), file_name)
    time.sleep(5 - index)
    write_to_file("worker %d %s again\n" % (index, datetime.datetime.now()), file_name)


if __name__ == '__main__':
  file_name = sys.argv[1]
  fd = open(file_name, 'w')
  fd.write("test input\n")
  fd.close()
  jobs = []
  for i in xrange(5):
    process = multiprocessing.Process(target=worker, args=(file_name, i,))
    process.start()
    jobs.append(process)

  for j in jobs:
    j.join()

我对此表示怀疑。这里的“open”调用是否阻塞并且已经受到保护,或者我是否需要在“write_to_file”调用周围实现锁定?本质上,当文件被另一个进程写入时,是否会对一个进程执行“打开”调用块

虽然可以协调从多个进程到其中并发打开的文件的写入,但通过锁定,可能需要范围锁定,可能需要fsync()和seek()。。。虽然这在大多数操作系统和某些条件下都是可能的。。。它还可能容易出错、不可靠,并且会出现一些奇怪的情况(特别是对于通过网络共享的文件,如NFS或SMB)

我认为这是使用多处理.Queue类的完美案例。让on-process充当使用者,写入文件,让所有其他人充当生产者,写入队列而不是文件。这可能会比您自己尝试拼凑的任何锁定策略表现更好,而且几乎可以肯定会更加健壮