私は配列を持っています - wordsArrayの各オブジェクトは別の配列 - 言葉リストを言うwordsArrayを持っています。 forループを使用して、各オブジェクト(wordList)を選択し、単語とスコアを持つNSDictionary
を返す別のクラスのメソッド-say wordScoreを呼び出します。それぞれのオブジェクトに対してwordScoreを1つずつ呼び出すのではなく、それらを並列に実行する方法はありますか?各wordListのwordScoreは並列に実行する必要があり、実行の終了時には、各wordScoreのすべてのNSDictionaries
を1つのNSDictionary
にマージする必要があります。クラスの複数回の並列実行メソッド
0
A
答えて
1
私はwordsArray
の同時列挙をやる、のは、私はこのクラスここから
@interface MyWordClass: NSObject
- (NSDictionary *)wordScore:(NSArray *)wordList;
@end
@implementation MyWordClass
- (NSDictionary *)wordScore:(NSArray *)wordList {
NSMutableDictionary *scores = [NSMutableDictionary new];
for (NSString *word in wordList) {
scores[word] = @(word.hash %100);
}
return [scores copy];
}
@end
のような愚かな何かを持っているとしましょう。私は、同時の反復のそれぞれにMyWordClass
の新しいインスタンスを作成します。最後に、@synchronized
ブロックを使用して結果を蓄積します。
NSArray *wordsArray = @[@[@"a", @"b", @"c"], @[@"1", @"2", @"3"]];
NSMutableDictionary *result = [NSMutableDictionary new];
[wordsArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSArray *wordList, NSUInteger idx, BOOL *stop) {
// The scores are being calculated concurrently
NSDictionary *scores = [[MyWordClass new] wordScore:wordList];
@synchronized(result) {
[result addEntriesFromDictionary:scores];
}
}];
NSLog(@"%@", result);
重要テイク遠かっは1である)同時列挙を行い、2)同時ブロック内の共有インスタンスを使用しない、および3)の結果を収集する@synchronized
ブロックを使用します。
+0
これは素晴らしい動作です! –
関連する問題
- 1. メソッドの並列実行
- 2. 複数のシナリオの並列実行
- 3. Jetson TK1複数ストリームの並列実行
- 4. 複数回実行すると並列化されますか?
- 5. 複数のメソッドを同時に複数回実行する#
- 6. 同じ@Sceduledメソッドの並列実行
- 7. 複数回のビュー実行
- 8. ScalaとSparkでの複数の関数の並列実行
- 9. Celery periodic_taskが複数回並列に実行されています
- 10. Verilogでの複数のモジュールの並列実行
- 11. 同じメソッドを複数の異なるパラメータで複数回実行するC#
- 12. 並列Javaの複数のファイルで同じ操作を実行
- 13. 毎回異なる引数で複数回並列にBashスクリプトを実行する方法は?
- 14. 複数のクラスのクラスメソッドを並列に実行するときのクラス状態の維持方法
- 15. 異なるクラスの複数のNSURLConnectionsが並行して実行中
- 16. エスプレッソテストを複数回実行
- 17. 並列で複数のjmxファイルを実行
- 18. 複数のバックグラウンドタスクを並列に実行する同じインテントサービス
- 19. Selenium複数のブラウザインスタンスを並列に実行する
- 20. Javaタイムアウト複数のタスクを並列に実行する
- 21. スパークストリーミングで複数のアクションを並列/非同期で実行
- 22. Gulp:複数のノードスクリプトを並列に実行する
- 23. jenkinsから複数のJmeterスクリプトを並列実行する
- 24. testngでのクラスとメソッドの並列化
- 25. メソッドを複数回実行できません
- 26. NEO4Jのパフォーマンスを複数回実行クエリ
- 27. 春のバッチジョブを複数回実行
- 28. 並列Python - 並列実行で別のクラスにオブジェクトを作成する
- 29. Springデータクエリの実行最適化:JpaRepositoryでのHibernate @Queryメソッドの並列実行
- 30. EAの複数のインスタンスを並行して実行する
[同時処理プログラミングガイド:ループ反復を同時に実行](https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid)を参照してください。/TP40008091-CH102-SW23)。スレッドセーフな方法で更新が完了したことを確認するには、更新プログラムを最終的な辞書に同期させる必要があります。 (b)並行計算のパフォーマンス向上は、複数スレッドのアクティビティを調整するオーバーヘッドによって相殺され、場合によっては、期待していたパフォーマンスの向上を完全になくすことがあります。 – Rob
あなたのコードをここに追加して助けてください –
結論としては、 'dispatch_apply'を使いますが、' dispatch_apply'のオーバーヘッドと結果の同期を正当化するために各スレッドで十分であることを確認してください。 – Rob