gRPC之應該注意的地方
記錄一下閱讀gRPC的OC原始碼時看到的問題
沒有暴露設定超時時間的介面
在GRPCCompletionQueue.m
裡面可以看到相關程式碼,可以看到超時時間是const,外部無法修改,相當於一個預設的超時時間
const int64_t kGRPCCompletionQueueDefaultTimeoutSecs = 60;
同時下面的處理也有點囧
...
gpr_timespec deadline = (timeoutSecs < 0)
? gpr_inf_future(GPR_CLOCK_REALTIME)
: gpr_time_from_seconds(timeoutSecs, GPR_CLOCK_REALTIME);
while (YES) {
// The following call blocks until an event is available or the deadline elapses.
grpc_event event = grpc_completion_queue_next(unmanagedQueue, deadline, NULL);
GRPCQueueCompletionHandler handler;
switch (event.type) {
case GRPC_OP_COMPLETE:
handler = (__bridge_transfer GRPCQueueCompletionHandler)event.tag;
handler(event.success);
break;
case GRPC_QUEUE_TIMEOUT:
// Nothing to do here
break;
case GRPC_QUEUE_SHUTDOWN:
grpc_completion_queue_destroy(unmanagedQueue);
return;
default:
[NSException raise:@"Unrecognized completion type" format:@"type=%d", event.type];
}
...
超時居然不做處理,理應拋個錯誤什麼的吧
網路執行緒完成後回撥在主執行緒
在GRXConcurrentWriteable.m
中可以看到,回撥時都工作在UI執行緒
// Designated initializer
- (instancetype)initWithWriteable:(id<GRXWriteable>)writeable {
if (self = [super init]) {
_writeableQueue = dispatch_get_main_queue();
_writeable = writeable;
}
return self;
}
- (void)enqueueSuccessfulCompletion {
dispatch_async(_writeableQueue, ^{
dispatch_once(&_alreadyFinished, ^{
// Cancellation is now impossible. None of the other three blocks can run concurrently with
// this one.
[self.writeable writesFinishedWithError:nil];
// Skip any possible message to the wrapped writeable enqueued after this one.
self.writeable = nil;
});
});
}
這種設計模式在AFN中有,在gRPC中也有,但是實際應用中我認為問題很大。我個人認為多執行緒程式設計的其中一個最佳實踐就是,哪個執行緒發起非同步任務,回撥時就工作在哪個執行緒,這樣對於呼叫方是最安全的。
相關文章
- 基本型別、字串該注意的地方型別字串
- 設定samba是應注意的地方!Samba
- 使用React 應當注意的幾個地方React
- 面試官:集合使用時應該注意哪些問題?我:應該注意該注意的問題!面試
- 應用SqlitePCL應該注意的問題SQLite
- Redux的應該注意的問題Redux
- BigDecimal使用注意的地方Decimal
- 關於CORS 應該注意的幾點CORS
- java泛型應該注意的問題。Java泛型
- 最應該注意的Oracle版本之一Oracle
- Java泛型應該注意的細節Java泛型
- 幻影v1.5b破解應注意的地方 (2千字)
- delete與delete[]需要注意的地方delete
- java高階用法之:JNA型別對映應該注意的問題Java型別
- 程式設計師工作之餘應該注意鍛鍊自己的身體程式設計師
- Java Thread應該注意的問題 (轉)Javathread
- 程式猿小白應該注意什麼
- margin-top使用需要注意的地方
- /etc/fstab檔案需要注意的地方
- 夜遊專案的開發應該注意哪些
- 購買硬碟應該注意的幾個問題硬碟
- 學習和使用PHP應該注意的10件事PHP
- js switch語句需要特別注意的地方JS
- Nagois監控oracle資料庫注意的地方GoOracle資料庫
- UIApplicationDelegate 中兩個值得注意的地方UIAPP
- link流程 建立時需要注意的地方
- 26個提升java效能需要注意的地方Java
- Struts中上傳檔案需要注意的地方
- Unix C語言值得注意的地方(轉)C語言
- C++ auto 型別推斷注意的地方C++型別
- 專案管理中,應該注意的5點原則專案管理
- Android EditText 的使用及值得注意的地方Android
- springMVC的@ResponseBody、@RequestBody使用需要注意的地方SpringMVC
- oracle over()的使用和需要特別注意的地方Oracle
- 做程式猿的老婆應該注意的一些事情
- Python中Lambda使用要注意的幾個地方Python
- 【Redis】redis-cluster需要注意的幾個地方Redis
- javascript原型繼承constructor需要注意的地方JavaScript原型繼承Struct