Module: Pod::PodGenerate::Patches::MultiProjectGeneratorPatch::ParallelMultiProjectGenerator
- Defined in:
- lib/cocoapods-podgenerate/patches/multi_project_generator_patch.rb
Instance Method Summary collapse
-
#install_all_pod_targets(projects_by_pod_targets) ⇒ Hash{String => TargetInstallationResult}
并行安装所有 pod target.
Instance Method Details
#install_all_pod_targets(projects_by_pod_targets) ⇒ Hash{String => TargetInstallationResult}
并行安装所有 pod target
原实现(串行):
projects_by_pod_targets.each_with_object({}) { |(p, pts), r| r.merge!(install_pod_targets(p, pts)) }
优化后(并行):
使用 Concurrent::FixedThreadPool,每个 project 分配一个线程
并发调用 install_pod_targets,结果通过 Mutex 合并到 all_results
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/cocoapods-podgenerate/patches/multi_project_generator_patch.rb', line 54 def install_all_pod_targets(projects_by_pod_targets) UI. '- Installing Pod Targets (parallel)' do pool_size = compute_pool_size mutex = Mutex.new all_results = {} errors = [] # v0.1.4: 收集错误而不是静默吞掉 pool = Concurrent::FixedThreadPool.new(pool_size) projects_by_pod_targets.each do |project, pts| pool.post do # 每个 project 独立安装其 pod target target_results = install_pod_targets(project, pts) mutex.synchronize { all_results.merge!(target_results) } rescue StandardError => e mutex.synchronize do errors << [project.path, e] Pod::UI.warn "[cocoapods-podgenerate] Pod target install failed for #{project.path}: #{e.}" end end end # v0.1.4: 带超时的等待,防止死锁 pool.shutdown unless pool.wait_for_termination(Pod::PodGenerate::Parallel::ThreadPool::DEFAULT_TIMEOUT) Pod::UI.warn '[cocoapods-podgenerate] Pod target install timed out after 120s — forcing shutdown' pool.kill end # v0.1.4: 如果有任何失败,抛出异常让 CocoaPods 知道安装不完整 unless errors.empty? raise Pod::Informative, "[cocoapods-podgenerate] #{errors.size} pod target(s) failed to install" end all_results end end |