队列组的使用

队列组可以监视队列组里面队列里面的任务执行情况

写法一

//创建一个并发队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//创建一个队列组
dispatch_group_t group = dispatch_group_create();
//我们将所有进行多线程的任务放在队列组异步函数中(和普通的异步函数多了一个group)
dispatch_group_async(group, queue, ^{
    NSLog(@"1---%@" , [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
    NSLog(@"2----%@" , [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
    NSLog(@"3---%@" , [NSThread currentThread]);
});
//监听函数(在所有的异步函数完成之后再调用这个函数)
dispatch_group_notify(group, queue, ^{
    NSLog(@"-------end---------");
});
  • 队列组的异步函数会做的事情
    1.封装任务
    2.把人物添加到队列中
    3.会监听任务的执行情况,通知group

写法二(函数对)

//创建一个并发队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//创建一个队列组
dispatch_group_t group = dispatch_group_create();

//在该方法后面的异步任务会被纳入到队列组的监听范围,进入群组
//dispatch_group_enter|dispatch_group_leave 必须要配对使用
dispatch_group_enter(group)

dispatch_async(queue , ^{
  NSLog(@"1----%@" , [NSThread currentTHread]);
//离开群组
dispatch_group_leave(group);
  });
  
  dispatch_async(queue , ^{
  NSLog(@"2---%@" , [NSThread currentTHread]);
//离开群组
dispatch_group_leave(group);
  });
//最后还是需要用notify方法进行拦截
dispatch_group_notify(group, queue, ^{
    NSLog(@"-------end---------");
});
  • dispatch_group_notify方法内部本身是异步的

相对于notify方法还有一个wait方法

dispatch_group_wait(group , DISPATCH_TIME_FOREVER);
NSLog(@"-----end----");
  • 等待。死等。直到队列中所有的任务都执行完毕之后才能执行
  • 本身是阻塞的
  • 如果他不执行完,后面的代码也不会执行
Python的`concurrent.futures`模块是Python标准库中的一个异步执行工具,它提供了两个高级API:`ThreadPoolExecutor`和`ProcessPoolExecutor`,分别用于实现线程池和进程池。线程池可以用来管理一工作线程,可以提交任务给这些工作线程执行,并且可以控制这些工作线程的并发数量。队列则是用来在工作线程之间传递数据的。 当你想要使用线程池和队列时,可以利用`ThreadPoolExecutor`中的`submit`方法提交任务到线程池,而任务函数中则可以使用队列来获取或发送数据。这种方式在多线程环境下处理数据时非常有用,因为它可以安全地在多个线程之间共享数据,而不需要担心线程安全问题。 下面是一个简单的示例: ```python from concurrent.futures import ThreadPoolExecutor, as_completed from queue import Queue # 定义一个任务函数,它从队列中取出任务并处理 def worker(task_queue): while not task_queue.empty(): # 从队列中获取任务 task = task_queue.get() # 进行处理 print(f"Processing {task}") # 告知队列任务处理完成 task_queue.task_done() # 创建一个任务队列 task_queue = Queue() # 向队列中添加一些任务 for i in range(5): task_queue.put(f"Task {i}") # 创建线程池 with ThreadPoolExecutor(max_workers=3) as executor: # 将任务分配给线程池处理 for _ in range(task_queue.qsize()): executor.submit(worker, task_queue) # 等待所有任务完成 task_queue.join() print("所有任务处理完毕") ``` 在这个示例中,我们首先创建了一个任务队列,并向队列中添加了一些任务。然后创建了一个线程池,并将工作线程提交给线程池来执行`worker`函数,该函数会从队列中取出任务并进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iOS开发疯狂者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值