Lon*_*eng 4 cadence-workflow temporal-workflow uber-cadence
在 Cadence/Temporal 工作流程编程中:
Async.procedure或创建,Async.function而在Golang中,线程必须通过 创建workflow.Go。所以为什么?Hashtableor来代替线程安全?ConcurrentHashMapHashMap工作流执行必须是确定性的。这是历史重放以重建线程状态所必需的。为了确定性,Cadence/Temporal 以协作方式控制线程调度(而不是像大多数操作系统那样抢占式):
所以:
HashMap在工作流代码中可以安全使用。Cadence/Temporal SDK 有一个DeterministicRunner 来操纵线程执行。例如Java SDK、Golang SDK。这个确定性运行程序将决定以正确的顺序运行哪个工作流线程,并且一次运行一个。对于每个决策任务,它将循环执行,直到“所有线程都被阻塞”——RunUntilAllBlocked/ExecuteUntilAllBlocked。
Async.procedure//Async.function会workflow.Go创建一个新的线程,并添加到definisticRunner中的链表中,这样执行就会受到控制。
因为任何时候只能执行一个线程,所以我们在常规代码中遇到的大多数竞争情况都不会发生。
然而,这并不意味着根本不存在赛车条件。在某些情况下,仍然会有一些条件导致一些死锁。
换句话说,合作并不意味着没有竞争条件或僵局。这只是意味着僵局的情况要少得多。并且不存在像抢占式线程调度那样导致脏读的竞争情况。
如果线程 A 获取锁 A 并等待活动,则它让位于线程 B,然后线程 B 获取锁 B 并等待活动;
活动结束后,线程A会在释放lockA之前尝试获取lockB,threadB会在释放lockA之前尝试获取lockA;
现在,当活动完成时,他们将陷入僵局。
使用iWF将使您远离这些复杂的概念。iWF 在 Cadence/Temporal 之上提供了一个很好的抽象,但保持相同的功能。
https://community.temporal.io/t/how-does-workflow-thread-synchronization-work/504
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |