试图在GCD中同时运行两个进程
我试图通过iOS中的GCD同时在背景中加载两组数据。 目前,我建立了两个不同的并发队列,我在其中运行每个任务。 但是,完成第一个队列和第二个队列(运行相同密集型任务)之间的延迟非常大(因此我假设它们不是同时运行)。 你们有没有关于如何解决这个问题的建议? 我不完全理解解决这个问题的正确方法。 谢谢!
dispatch_queue_t myQueue = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t myQueue2 = dispatch_queue_create("com.a.identifier2", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myQueue, ^{
[self fetchDataWithDataFromUrl:[NSURL URLWithString:linkOne]];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
dispatch_async(myQueue2, ^{
[self fetchDataWithDataFromUrl2:[NSURL URLWithString:linkTwo]];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
他们很可能同时运行。 他们可能不会同时运行。 了解其中的差异很重要。 GCD提供了并发性,对并行性做出了很少的承诺。 许多图书馆都是如此(通常是更重要的功能)。
你有多少个核心? 如果你只有一个核心,那么第二个工作等待第一个完成就不足为奇了。 如果你有两个核心,但主队列有很多工作,那么它可能会在你的一个块之前被优先处理。 您应该使用Instruments的GCD工具来探索什么时候进行计划( printf
在这里也是一个强大的工具)。 请记住,上下文切换需要时间。 为了在核心上获得最佳吞吐量,您希望在该核心上运行一件事,直到该事件完成,然后运行下一件事。 来回切换使它们一起完成将使它们两个运行更慢。 大多数系统偏向于吞吐量。 没有理由换出一个块来运行相同优先级的块。
你知道这两个工作同时得到他们的数据吗? 如果你从网络中拉出来,很可能会比另一个来得快或者来得快。 您可能在单个连接上进行流水线处理,这可能会使您的网络流量序列化。 你应该记录数据到达你的时间。 你还应该记录块的实际启动时间(在块的顶部放一个printf()
)。
如果在更新UI之前需要第一个工作等待第二个工作完成,那么您应该将这两个作业放入dispatch_group,以便reloadData
等待它们。
你真的需要深入了解正在运行什么,什么时候运行。 这种症状有时候意味着你正在其他地方的后台线程上更新你的UI。 这可能导致获得正确更新的很长时间(可能与此代码无关)。 使用printf()
语句和使用工具对于确保知道实际发生的事情非常重要。
如果速度比吞吐量更重要(你认为它是这样),你可能希望把你的工作分解成更小的部分并交织它们。
链接地址: http://www.djcxy.com/p/79399.html上一篇: Attempting to run two processes simultaneously in GCD
下一篇: CUDA: do I need different streams on multiple GPUs to execute in parallel?