我有一个大文本文件,我想处理每一行(做一些操作)并将它们存储在数据库中.由于单个简单程序花费的时间太长,我希望它可以通过多个进程或线程来完成.每个线程/进程应从该单个文件中读取不同的数据(不同的行),并对其数据(行)执行一些操作并将它们放入数据库中,以便最终处理完所有数据并进行处理.数据库与我需要的数据一起转储.
但我无法弄清楚如何处理这个问题.
我正在尝试解决一个涉及大量子问题的大数值问题,我正在使用Python的多处理模块(特别是Pool.map)将不同的独立子问题拆分到不同的核心上.每个子问题涉及计算大量的子子问题,我试图通过将它们存储到文件中来有效地记忆这些结果,如果它们还没有被任何进程计算,否则跳过计算并只读取文件中的结果.
我有文件的并发问题:不同的进程有时检查是否已经计算了子子问题(通过查找存储结果的文件),看到它没有,运行计算,然后尝试同时将结果写入同一文件.我该如何避免写这样的碰撞?
我在python中遇到以下问题.
我需要并行进行一些计算,我需要在文件中顺序编写结果.所以我创建了一个接收multiprocessing.Queue文件句柄的函数,进行计算并在文件中打印结果:
import multiprocessing
from multiprocessing import Process, Queue
from mySimulation import doCalculation
# doCalculation(pars) is a function I must run for many different sets of parameters and collect the results in a file
def work(queue, fh):
while True:
try:
parameter = queue.get(block = False)
result = doCalculation(parameter)
print >>fh, string
except:
break
if __name__ == "__main__":
nthreads = multiprocessing.cpu_count()
fh = open("foo", "w")
workQueue = Queue()
parList = # list of conditions for which I want to …Run Code Online (Sandbox Code Playgroud) 什么是正确的解决方案,以确保在使用许多线程和进程时文件永远不会被破坏.
线程版本,关心打开错误.
lock = threading.RLock()
with lock:
try:
f = open(file, 'a')
try:
f.write('sth')
finally:
f.close() # try close in any circumstances if open passed
except:
pass # when open failed
Run Code Online (Sandbox Code Playgroud)
对于进程,我猜必须使用multiprocessing.Lock
但如果我想要2个进程,并且第一个进程拥有2个线程(每个进程使用一个文件)
只有理论,但我想知道如何将同步与线程和进程混合.线程是否从进程"继承"它,所以只需要进程之间的同步?
2.我不确定上面的代码是否需要嵌套尝试以防写入失败,我们想要关闭打开的文件(如果在锁定释放后它将保持打开状态)