Search code examples
python.nettask-parallel-libraryironpythonparallel.foreach

Collecting IronPython Parallel Loop results


I am trying to get a result from the tasks method in IronPython similar to how results.get works with CPython multiprocessing.Queue

from System.Threading.Tasks import *
def testThread(dataPnt,constData):
    return dataPnt

def main():

    dataToSplit = range(5)
    constData = 10

    threadResult = Parallel.ForEach(dataToSplit, lambda dataPnt: testThread(dataPnt,constData))

    print(threadResult)

main()

At this point threadResult is System.Threading.Tasks.ParallelLoopResult but I can't find any decent documentation. The closest has been this post but it is incrementing and I need an array returned.


Solution

  • Parallel.ForEach is a multi-processing operation but given that you expect a result from your operation you would either have to use a shared result variable (e.g. some sort of concurrent collection) or use a parallel LINQ projection operation.

    An approach close to your sample could look like:

    # get LINQ dependencies
    import clr
    clr.AddReference("System.Core")
    import System
    clr.ImportExtensions(System.Linq)
    
    from System.Threading.Tasks import *
    def testThread(dataPnt,constData):
        print dataPnt
        return dataPnt
    
    def main():
    
        dataToSplit = range(5)
        constData = 10
    
        threadResult = dataToSplit.AsParallel().Select(lambda dataPnt: testThread(dataPnt,constData)).ToList()
    
        print(threadResult)
    
    main()