加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift命令行工具中的多个工作程序

发布时间:2020-12-14 05:48:11 所属栏目:百科 来源:网络整理
导读:在Swift中编写命令行工具(CLT)时,我想处理大量数据.我已经确定我的代码受CPU限制,性能可以从使用多个内核中受益.因此,我想并行化部分代码.说我想实现以下伪代码: Fetch items from databaseDivide items in X chunksProcess chunks in parallelWait for chu
在Swift中编写命令行工具(CLT)时,我想处理大量数据.我已经确定我的代码受CPU限制,性能可以从使用多个内核中受益.因此,我想并行化部分代码.说我想实现以下伪代码:
Fetch items from database
Divide items in X chunks
Process chunks in parallel
Wait for chunks to finish
Do some other processing (single-thread)

现在我一直在使用GCD,一个天真的方法看起来像这样:

let group = dispatch_group_create()
let queue = dispatch_queue_create("",DISPATCH_QUEUE_CONCURRENT)
for chunk in chunks {
    dispatch_group_async(group,queue) {
        worker(chunk)
    }
}
dispatch_group_wait(group,DISPATCH_TIME_FOREVER)

但是GCD需要一个运行循环,因此代码将挂起,因为组永远不会执行. runloop可以使用dispatch_main()启动,但它永远不会退出.也可以在几秒钟内运行NSRunLoop,但这不是一个可靠的解决方案.无论GCD如何,使用Swift如何实现?

我错误地解释了挂起程序的锁定线程.没有运行循环,工作将执行得很好.问题中的代码运行正常,并阻止主线程直到整个组完成.

所以说块包含4项工作负载,下面的代码包含4个并发工作者,然后等待所有工作完成:

let group = dispatch_group_create()
let queue = dispatch_queue_create("",queue) {
        do_work(chunk)
    }
}
dispatch_group_wait(group,DISPATCH_TIME_FOREVER)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读