また別の質問なんですが,DispatchWorkItem って cancel 呼んでも止められる訳ではないんですね.「一つの処理に時間がかかりすぎてる場合に停止する(メモリとかも解放する)」って,プロセスそのものを分けないと無理なんでしょうか? let semaphore = DispatchSemaphore(value: 0) let mainTask = DispatchWorkItem { while true { print("working...") sleep(1) } } let bgTask = DispatchWorkItem { for i in 0 ..< 3 { print(i) sleep(1) } semaphore.signal() } DispatchQueue.global(qos: .userInitiated).async(execute: mainTask) DispatchQueue.global(qos: .background).async(execute: bgTask) semaphore.wait() mainTask.cancel() bgTask.cancel() print("canceled") sleep(10) // まだ working... が出続ける