KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm having the following problem in python. I need to do some calculations in parallel whose results I need to be written sequentially in a file. So I created a function that receives a multiprocessing.Queue and a file handle, do the calculation and print the result in the file: 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 doCalculation() for x in parList: workQueue.put(x) processes = [Process(target = writefh, args = (workQueue, fh)) for i in range(nthreads)] for p in processes: p.start() for p in processes: p.join() fh.close() But the file ends up empty after the script runs. I tried to change the worker() function to: def work(queue, filename): while True: try: fh = open(filename, "a") parameter = queue.get(block = False) result = doCalculation(parameter) print >>fh, string fh.close() except: break and pass the filename as parameter. Then it works as I intended. When I try to do the same thing sequentially, without multiprocessing, it also works normally. Why it didn't worked in the first version? I can't see the problem. Also: can I guarantee that two processes won't try to write the file simultaneously? EDIT: Thanks. I got it now. This is the working version: <p
Tags (comma-separated)
Save Edits
Cancel