我有三项任务。任务1、任务2和任务3。task1和task2是异步任务,即它们同时执行任务,返回完成结果的时间不可预测。最初,我希望task1和task2同时执行,并在得到结果后执行task3。
dispatch_group_t dispatchGroup = dispatch_group_create();
dispatch_group_async(dispatchGroup,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//do task1 async
});
dispatch_group_async(dispatchGroup,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//do task2 async
});
dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (true) {
sleep(0.2); //avoid cpu timeslice fully used
//after get task1 and task2 result
// do task3
}});
我设计的结构如上所述,但我总是得到不好的结果,比如如果task2是一个url发布请求,使用afnet,我不能得到成功块参与。
任何帮助我的人我都会感激的。
好的,还有一个解决方案:
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue1 = ...;
dispatch_queue_t queue2 = ...;
//add task to queue
dispatch_group_async(group, queue1, ^{NSLog(@"Hello, World! TASK 1"); });
dispatch_group_async(group, queue2, ^{NSLog(@"Hello, World! TASK 2"); });
// wait forever
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
// or wait with timeout
dispatch_group_wait(group, DISPATCH_TIME_NOW);
//Add notify for end of all tasks
dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"Tasks 1 and 2 are done!");});
检查时间是否已过
dispatch_time_t waitTime = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
long waitResult = dispatch_group_wait(group, waitTime);
if (waitResult == 0)
{
// all done!
} else
{
// time out
}
不要忘记释放
dispatch_release(group);
我认为有这样的解决办法:
__weak CLASS * weakSelf = self;
bool task1Done;
bool task2Done;
FIRST ONE TASK
task1Done = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
do something at background....
dispatch_async(dispatch_get_main_queue(), ^{
do some thing at main thread...
[weakSelf task1Done];
});
});
SECOND TASK
task2Done = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
do something at background....
dispatch_async(dispatch_get_main_queue(), ^{
do some thing at main thread...
[weakSelf task2Done];
});
});
============
-(void) task1Done
{
task1Done = YES;
if (task1Done && task2Done) [self startTask3];
}
-(void) task2Done
{
task2Done = YES;
if (task1Done && task2Done) [self startTask3];
}
-(void) startTask3
{
.....
}
编辑:Redis+Sidekiq完成该工作。在这里,Redis作为一个消息队列工作,Sidekiq在后台处理这些消息。我很想知道,选择一个显式代理(如RabbitMQ、SQS、Redis PubSub)而不是Redis+SideKiQ有什么用例和好处?
如果这被认为是一个可接受的实践,我需要什么-如果有-错误处理?我的理解是,task.wait()将重新抛出异步操作抛出的任何异常,并且我没有提供任何取消异步操作的机制。仅仅调用task.wait()就足够了吗?
当生成消息到Kafka时,您可以得到两种错误:可检索和不可检索。在处理它们时,你应该如何区分它们? 我希望异步生成记录,将接收到不可重试异常的记录保存在另一个主题(或HBase)中,并让生产者为我处理所有接收到可重试异常的记录(最多尝试次数,当它最终到达时,会成为第一批异常之一)。 我的问题是:尽管有,但生产者是否仍会自行处理可检索的异常?因为在接口回调中说: 可重试异常(暂时的,可通过增加#.重
问题内容: 我有一个场景,我将必须对服务器进行六个http调用才能获取六个不同项目的数据。这些服务器调用不能合并,并且它们就是那样。例如:如果您需要GOOGLE的报价信息,则向服务器发送请求,以请求google的报价信息。接下来,如果您需要Yahoo,则可以发起另一个http调用,依此类推。 情况如下: 现在,我的最终用户想要比较6家不同的公司。 正如我提到的那样,我不可避免地要使用6个异步任务进
我试图弄清楚如何处理从返回的数据。 我有一个活动,我正在调用异步Firebase get操作(存在于其他类中的操作),并且我想使用检索到的ArrayList的大小更新活动中存在的。以下是我在活动创建中获取的 Firebase 调用: 这是我的Firebase操作: 在Android中,最好的方法是什么?是否有可能实现各种适配器或完成处理程序?
在Servlet 3.0中,引入了异步处理的概念。所以所有的书都说这消除了每个请求一个线程的要求。我已经测试过了,是的,它确实有效。现在,我有一个简单的servlet,用户在其中以同步模式启动HTTP请求。线程只需Hibernate1秒,然后回复客户端。当我对这种模式进行负载测试时,服务器每秒只能处理4个请求。现在,我将同步模式更改为异步模式,并根据请求创建一个新线程,将原始http线程释放回池。