gpt4 book ai didi

multithreading - IronPython 多处理模块

转载 作者:行者123 更新时间:2023-12-03 13:05:02 29 4
gpt4 key购买 nike

我有一些用 Dotnet 编写的 dll,用于访问数千个二进制文件。数据按目录划分,因此作为性能增强,我想到了使用多个进程或线程来搅动文件。

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

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

我的下一个想法是使用 Task

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)

或者使用线程
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 示例

最佳答案

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

通过的最简单方法idx 的参数__doWork 函数将使用 lambda 来捕获值和调用。 (请注意 this question 中讨论的范围问题,这也暗示了引入中间范围的替代解决方案)

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

附带说明:您必须将任务列表转换为数组才能让 Task.WaitAll 满意。

关于multithreading - IronPython 多处理模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18696872/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com