gpt4 book ai didi

objective-c - Obj-C 设计模式 : parallel task launcher

转载 作者:行者123 更新时间:2023-12-03 12:52:54 25 4
gpt4 key购买 nike

我目前有一个 shell 脚本,它在 GraphicsMagick 的帮助下一个接一个地处理许多图像。它工作正常,所有计算都是正确的,一切正常。 (这不是一个“简单”的脚本,它涉及从 JSON 文件读取尺寸,根据许多约束转换一堆图像)。

当我们使用双核或四核计算机时,我想并行化它。由于我是一名 iPhone 开发人员,喜欢向自己介绍 Mac 开发,我想使用“命令行工具”模板使用 XCode 和 Objective-C 创建它。

到目前为止一切顺利,但现在我面临着“任务调度程序”对象的设计。在运行循环中,在单独的线程中,使用 block ,使用或不使用 GCD,使用或不使用 ARC 之间运行 NSTasks 之间,我相当迷失。

一个人将如何实现这一目标?我正在考虑使用简单的线程来生成 NSTask,让它们在完成时报告,并通知我的调度员的委托(delegate),以便它可以升级其进度条。但我真的很想与 Grand Central Dispatch 取得联系。有没有人对做什么和不做什么有任何想法、想法和建议?

编辑:我正在阅读 Apple 的文档,并找到了 NSOperationQueue 类。难道这正是我在这里需要的吗?

最佳答案

用于启动包括参数和环境变量在内的独立进程的一个很好的类是 NSTask。有关详细信息,请参阅文档。这是一个小命令行工具,它启动 10 个并发进程并等待它们完成。 NSOperationQueue 在这里是多余的,因为任务已经同时启动。

-- 编辑:有限并发的改进版本 --

int main (int argc, const char * argv[])
{
@autoreleasepool {

// Let's not have more than 5 parallel processes
dispatch_semaphore_t limit = dispatch_semaphore_create(5);
dispatch_semaphore_t done = dispatch_semaphore_create(0);

for (int i=0; i<10; i++) {
// Setup the taks as you see fit including the environment variables.
// See docs on NSTask for more on how to use this object.
NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/bin/ls";
task.arguments = [NSArray arrayWithObject:@"-la"];
task.terminationHandler = ^(NSTask *task) {
dispatch_semaphore_signal(limit);
if (i==9) dispatch_semaphore_signal(done);
};

dispatch_semaphore_wait(limit, DISPATCH_TIME_FOREVER);
[task launch];
}
dispatch_semaphore_wait(done, DISPATCH_TIME_FOREVER);
dispatch_release(limit);
dispatch_release(done);
}
return 0;

}

-- 原版 --
int main (int argc, const char * argv[])
{
@autoreleasepool {

NSObject *lock = [[NSObject alloc] init];
int __block counter = 10;

for (int i=0; i<10; i++) {
// Setup the taks as you see fit including the environment variables.
// See docs on NSTask for more on how to use this object.
NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/bin/ls";
task.arguments = [NSArray arrayWithObject:@"-la"];
task.terminationHandler = ^(NSTask *task) {
@synchronized(lock) { counter--; }
};
[task launch];
}

while (counter)
usleep(50);

[lock release];
}
return 0;
}

在您的情况下,您可能希望将 NSTask 对象保存在数组中以便于管理。

关于objective-c - Obj-C 设计模式 : parallel task launcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7319193/

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