iOS GCD深入解析:信号量dispatch_semaphore的运用

需积分: 0 1 下载量 136 浏览量 更新于2024-08-05 收藏 241KB PDF 举报
“iOS GCD 中级篇 - dispatch_semaphore(信号量)的理解及使用1” 在iOS开发中,GCD(Grand Central Dispatch)是一种强大的多线程管理工具,用于优化应用程序的执行效率。本文主要讨论的是GCD中的一个高级特性——`dispatch_semaphore`,即信号量,它可以帮助我们有效地控制并发访问资源的数量。 信号量是一种同步机制,用于限制同时访问特定资源的线程数量。在上述问题中,如果有三个线程同时尝试访问两个可用资源,信号量可以确保只有两个线程能够进行操作,而第三个线程则需等待,直到有资源释放。这样,我们可以避免资源过度竞争,防止系统负载过大。 信号量的核心函数包括三个: 1. `dispatch_semaphore_create(long value)`: 这个函数用于创建一个信号量,并设置其初始值。参数`value`表示信号量的初始计数值,也就是允许并发访问的资源数量。 2. `dispatch_semaphore_wait(dispatch_semaphore_t semaphore, dispatch_time_t timeout)`: 当线程需要访问资源时,调用此函数会减少信号量的值。如果此时信号量的值大于0,线程将继续执行;否则,线程将被挂起,直到信号量的值变为正或达到指定的超时时间。 3. `dispatch_semaphore_signal(dispatch_semaphore_t semaphore)`: 当线程完成对资源的访问后,调用此函数增加信号量的值,允许其他等待的线程继续执行。 使用信号量的一个典型例子是限制并发下载任务的数量。在代码示例中,`dispatch_semaphore_create(2)`创建了一个初始值为2的信号量,表示最多允许两个下载任务并发执行。`dispatch_semaphore_wait`在开始任务前减小信号量的值,如果值大于0,则继续执行任务,否则线程被挂起。任务完成后,通过`dispatch_semaphore_signal`增加信号量的值,释放一个资源,使得等待的线程有机会获取资源并继续执行。 总结起来,`dispatch_semaphore`在iOS GCD中扮演着协调并发访问的角色,通过控制信号量的值来实现线程间的同步。它简化了多线程环境下的资源管理,避免了因过度并发导致的性能问题。在实际开发中,合理利用信号量可以提高程序的稳定性和效率。

def write(self, vals): audit = self.env['approval.flow'].search([('approval_cannot_run_id', '=', '修改')]) value_list = list(vals.keys()) receive_list = [] value_list_not_in_receive_list = [i for i in value_list if i not in receive_list] value_list = value_list_not_in_receive_list # 应付 dispatch_number = 0 dispatch_id = self.env['roke.dispatch.order.management.price.approve'].search([('order_id.id', '=', self.id)]) dispatch_list = ['value03', 'value04', 'value05', 'value06', 'value07', 'value08'] if dispatch_id: for rec in value_list: for dispatch_list_id in dispatch_list: if rec == dispatch_list_id: if dispatch_id.approval_status != '未提' and dispatch_id.approval_status != '驳回': raise UserError("应付费用已开始审核不允许修改") value_list_not_in_dispatch_list = [i for i in value_list if i not in dispatch_list] value_list = value_list_not_in_dispatch_list dispatch_number = 1 break if dispatch_number: break # 基础 base_number = 0 base_list = ['client', 'department_manager', 'box_number', 'shipping_companies', 'field_station', 'ship_name_voyage', 'port_of_discharge', 'box_type', 'code', 'bill__of_lading_number', 'departure_date', 'lead_sealing', 'booking_time', 'date_of_pick_up', 'encore_date', 'set_port_date', 'estimated_range', 'destination_port_arrival_time'] if value_list: for rec in value_list: for base_list_id in base_list: if rec == base_list_id: if dispatch_id: if dispatch_id.approval_status != '未提' and dispatch_id.approval_status != '驳回': raise UserError("应付费用已开始审核不允许修改") base_number = 1 break if base_number: break return super(Rokedispatchordermanagement, self).write(vals) audit审核完成如果是修改不能修改如果不是可以修改怎么写可以实现

2023-06-13 上传