回答这个问题需要一些银行知识:
假设我已从帐户a1-> a2和a2-> a3设置了SI 这些只是两条指令,需要批量处理。 但我希望这两条指令将在两个不同的流中处理。
这是不可能的,因为帐户a2在流1中被锁定而无法在流2中处理,直到流1完成其处理。
解决此问题的方法: 要么我在一个流中执行所有SI,要么我确定指令的依赖性,并将这些指令相应地放入流中。
或者还有其他方法可以解决这个问题。
我正在使用Java和Hibernate。
答案 0 :(得分:0)
我不熟悉您问题的具体细节,但听起来很像管道CPU中的data hazards。
在您的情况下,您希望最大限度地利用功能单元(流),而不会引入数据危险。也许你可以编写一个简单的调度程序,展望未来的n条指令并将它们安排到流中?
/**
* Keeps track of which stream is scheduled to process each account.
* If an account is not currently scheduled to be processed, it doesn't appear in the keySet of this map.
*/
Map<Account, Stream> accountsInFlight; // use a synchronized implementation
void schedule(Instruction instruction) {
// If the input account is in flight somewhere, use that stream
if (accountsInFlight.containsKey(instruction.getInAccount())) {
scheduleToStream(instruction, accountsInFlight.get(instruction.getInAccount()));
// If the output account is in flight somewhere, use that stream
} else if (accountsInFlight.containsKey(instruction.getOutAccount())) {
scheduleToStream(instruction, accountsInFlight.get(instruction.getOutAccount()));
// If neither are in flight, this is a good candidate for parallel execution,
// put it in a different stream
} else {
Stream stream = // pick a stream (maybe the one with the shortest queue?)
scheduleToStream(instruction, stream);
}
}
private void scheduleToStream(Instruction instruction, Stream stream) {
stream.addToQueue(instruction);
// Update accountsInFlight
accountsInFlight.put(instruction.getInAccount(), stream);
accountsInFlight.put(instruction.getOutAccount(), stream);
}
// Remove accounts from the map when the instruction completes
请注意,这都是假代码:它没有被优化,也没有正确覆盖所有情况,但也许它会给你一些开始的想法。