<div dir="ltr">Hi all,<div><br></div><div>The bottleneck in my script at the moment is the calculation of zonal stats using 'grass7:r.stats.zonal'. I thought I might speed things up by using QgsTask.fromFunction() or QgsProcessingAlgRunnerTask() to run these calculations in parallel. In my tests of both approaches the tasks seem to complete (task.status() == QgsTask.Complete), but the output file is only generated for 1 of 4 parallel tasks (the task that finishes first).</div><div><br></div><div>I'm assuming this is because grass algorithms are not thread safe? Or am I missing something in my implementation that could make this work?</div><div><br></div><div>Thanks,</div><div>Rudi</div><div><br></div><div><br></div><div><br></div><div>My code for the QgsTask approach is as below:</div><div><br></div><div><div>def getZonal(task, habitatModelFile, cover):</div><div>    tempFile = QgsProcessingUtils.generateTempFilename("output.tif")</div><div>    processing.run("grass7:r.stats.zonal", {</div><div>        'base':habitatModelFile,</div><div>        'cover':cover,</div><div>        'method':5,</div><div>        '-c':False,</div><div>        '-r':False,</div><div>        'output':tempFile,</div><div>        'GRASS_REGION_PARAMETER':None,</div><div>        'GRASS_REGION_CELLSIZE_PARAMETER':0,</div><div>        'GRASS_RASTER_FORMAT_OPT':'',</div><div>        'GRASS_RASTER_FORMAT_META':''},context=context,feedback=algFeedback)</div><div>    </div><div>    if task.isCanceled():</div><div>        deleteFile(tempFile)</div><div>        return</div><div><br></div><div>    return tempFile</div></div><div><br></div><div><div>ls90Task = QgsTask.fromFunction('LS90', getZonal, habitatModelFile=hm1, cover=ls90Layer)<br></div><div>QgsApplication.taskManager().addTask(ls90Task)</div><div>feedback.pushInfo("Calculating LS14 mean...")</div><div>ls14Task = QgsTask.fromFunction('LS14 ', getZonal, habitatModelFile=hm2, cover=ls14Layer)</div><div>QgsApplication.taskManager().addTask(ls14Task)</div><div>hs90Task = QgsTask.fromFunction('HS90 ', getZonal, habitatModelFile=hm3, cover=hs90Layer)<br></div><div>QgsApplication.taskManager().addTask(hs90Task)</div><div>hs14Task = QgsTask.fromFunction('HS14 ', getZonal, habitatModelFile=hm4, cover=hs14Layer)<br></div><div>QgsApplication.taskManager().addTask(hs14Task)</div><div><br></div><div><div>while (len([t for t in [ls90Task.status(), ls14Task.status(), hs90Task.status(), </div><div>            hs14Task.status()] if t in [QgsTask.Running, QgsTask.Queued]]) > 0) </div><div>            and not feedback.isCanceled():</div></div><div>    sleep(1)</div></div><div><br></div><div>if feedback.isCanceled():<br></div><div>    # some cleanup code (send task.cancel() and wait for tasks to terminate)</div><div>    break</div><div><br></div><div><div>ls90Result = ls90Task.returned_values</div><div>ls14Result = ls14Task.returned_values</div><div>hs90Result = hs90Task.returned_values   # only this file exists</div><div>hs14Result = hs14Task.returned_values</div></div><div><br></div><div><br></div></div>