9.6 erlang并发编程杂项-进程字典

每个进程都拥有一个字典。通过下列BIF可以操作该字典:

put(Key, Value)

将与键Key相关联的新值Value加入进程字典。若与Key相关联的值已经存在则该值将被删除并被新值Value替代。该BIF返回原先与Key关联的值,若原先没有值与Key相关联,则返回undefined。Key和Value可以是任意的Erlang项式。

get(Key)

返回进程字典中与Key关联的值。若没有值与Key相关联则返回undefined。

get()

以{Key, Value}元组列表的形式返回整个进程字典。

get_keys(Value)

返回一个列表,包含进程字典中值为Value的所有的键。

erase(Key)

返回整个进程字典后将至删除。

对于各个进程而言进程字典是局部的。进程刚被创建时进程字典为空。任何函数都可通过调用put(Key, Value)向字典中添加{Key, Value}键值对,而后再通过调用get(Key)取出。在catch作用域内,若在调用put后调用throw或出现错误,放入字典的值不会被撤回。

借助get()和erase()可以获取或删除整个字典。删除单个条目可用erase(Key)。

有时候我们希望在多个不同函数中访问同一块全局数据,而将之作为进程中所有函数的参数来进行传递又不太方便。小心使用put和get就可以避免这个问题。

get和set在语言中引入了破坏性操作,令程序员写出具有副作用的函数。这些函数的调用结果可能跟它们的调用次序相关。对进程字典的使用应该非常小心。get和set就好比传统命令式语言里的goto。get和set在某些特定场景下很有用,但使用它们会造成不清晰的代码,应该尽可能地避免使用。鉴于不鼓励使用进程字典,本书的所有程序都不使用进程字典——为了内容完整,只在此处和附录中包含相关内容。

转载请注明:《9.6 erlang并发编程杂项-进程字典