IronPython多处理模块

时间:2013-09-09 11:07:42

标签: multithreading ironpython

我有一些用Dotnet编写的dll,我用它来访问数千个二进制文件。数据按目录划分,所以作为性能增强,我想到使用多个进程或线程来浏览文件。

我有一个函数,目前是主类的一部分(需要self作为参数),这很容易被重构为私有方法。

我的第一个倾向是使用Multiprocess模块​​,但这似乎不适用于IronPython。

我的下一个想法是使用任务

def __createThreads(self):
    tasks = Array.CreateInstance(Task, 5)
    for idx in range(0, 5):
        tasks.append(Task.Factory.StartNew(self.__doWork, args=(idx,)))

    Task.WaitAll(tasks)

def __doWork(self, idx):

    for index in range (0, idx):
        print "Thread: %d | Index: %d" % (idx, index)

或者使用Thread

def __createThreads(self):
    threads = list()
    for idx in range(0, 5):
        t = Thread(ThreadStart(self.__doWork))
        t.Start()
        threads.append(t)

    while len(threads) > 0:
        time.sleep(.05)
        for t in threads:
            if(not t.IsAlive):
                threads.remove(t)

我找不到的是IronPython如何传递争论的例子

1 个答案:

答案 0 :(得分:1)

请注意,您的两个示例并不完全相同。任务版本只会在运行时认为这是一个好主意时创建/使用实际并发线程(除非您指定TaskCreationOptions.LongRunning)。你必须决定什么适用于你的用例。

idx 参数传递给 __ doWork 函数的最简单方法是使用lambda来捕获值和调用。 (请注意this question中讨论的范围问题,这也提示了引入中间范围的替代解决方案)

tasks.append(Task.Factory.StartNew(lambda idx = idx: self.__doWork(idx)))

作为旁注:您必须将任务列表转换为数组,以便Task.WaitAll满意。