gpt4 book ai didi

promise - Pharo promise :

转载 作者:行者123 更新时间:2023-12-01 13:18:49 28 4
gpt4 key购买 nike

今年早些时候,我在 Pharo Smalltalk 参与了一个 promise 项目。这个想法是为了实现以下行为:

([ 30 seconds wait. 4 ]promiseValue )then: [ :a| Transcript crShow: a ].

这意味着 promise 将在后台等待 30 秒并打印在 Transcript 上。这不应导致 Pharo 用户界面卡住。我下面的实现卡住了用户界面。为什么?

实现 Promises 行为的类 promise:

Object subclass: #Promise
instanceVariableNames: 'promiseValue promiseError promiseLock'
classVariableNames: ''
package: 'META-Project-[pgakuo]'

Promise 类中的方法

doesNotUnderstand: aMessage 
^ self value
perform: aMessage selector
withArguments: aMessage arguments

then: aBlock
promiseLock isSignaled
ifTrue: [ ^ self ].
promiseLock wait.
promiseError
ifNotNil: [ promiseError
privHandlerContext: thisContext;
signal ].
aBlock value: promiseValue.
self value: aBlock

then: aBlock catch: anotherBlock
promiseLock isSignaled
ifFalse:
[ promiseLock wait.
promiseError ifNotNil: [ anotherBlock value: promiseError ].
promiseValue ifNotNil: [ aBlock value: promiseValue. self value: aBlock ]]

value
promiseLock isSignaled ifFalse: [ promiseLock wait ].
promiseError ifNotNil:
[ promiseError
privHandlerContext: thisContext;
signal ].
^promiseValue

value: aBlock
promiseLock := Semaphore new.
[
[[promiseValue := aBlock value]
on: Error do: [:err | promiseError := err]]
ensure: [promiseLock signal]] fork

并向 Blockclosure 添加了一种方法,使闭包使用 Promise 行为。

promiseValue
^ Promise new value: self

一个 block 被传递给一个Promise的实例,它被Promise执行>>value:它使用fork在后台执行任务。但它似乎并没有按预期工作

最佳答案

在 Playground 中工作时,您将在 UI 流程中工作。因此,您实际上是在用您的示例暂停 UI 进程。试试这个:

[ ([ 30 seconds wait. 4 ] promiseValue) then: [ :a |
Transcript crShow: a ] ] forkAt: Processor userBackgroundPriority.

编辑

由于原始表达式明确要求不锁定 UI,因此您应该做的是:

  1. 不要覆盖#doesNotUnderstand:
  2. 你有一个选择:

    1. 在评估 promise 时总是 fork

      这会产生进程调度和进程创建的开销。您还将丢失原始流程的上下文,除非您明确保存它(消耗内存,导致性能损失)

    2. 只有当当前进程是UI进程时才会fork

      判断当前进程是否为UI进程,简单快捷。这不是您通常会做的事情,但对于您的情况,我建议您采用这种方法。

  3. 我建议为 Promise 实现一个类端方法,例如Promise 类>>值:。这将使您能够将此特定案例与其余实现隔离开来。例如

    value: aBlock
    | instance |
    instance := self new.
    self isUIProcess
    ifTrue: [ [ instance value: aBlock ] forkAt: Processor userBackgroundPriority ]
    ifFalse: [ instance value: aBlock ].
    ^ instance

关于promise - Pharo promise :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51805017/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com