gpt4 book ai didi

concurrency - 想要一个简单的程序来说明使用线程并发 lisp 的使用

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:01 26 4
gpt4 key购买 nike

  • 我只是对 lisp 编程感到好奇并且想了解如何通过创建线程来使用并发 lisp。

    -我还想弄清楚 lisp 中的 pcall() 函数。

最佳答案

对您问题的评论为您提供了解决问题的正确方法。我希望这仍然有帮助。

如果你想使用common lisp并发,其中一种方法是Eager Future2 http://common-lisp.net/project/eager-future/ ,但你可以在这里选择其他模型 http://www.cliki.net/concurrency

Eager Future,顾名思义,基于 Futures

“Eager Future2 是一个提供可组合的 Common Lisp 库统一并行和惰性计算的并发原语是与CL的条件系统集成,并具有自动资源管理。Eager Future2 中并发的基本单位是 future ,即一种数据类型,充当无参数值的代理并发计算的函数 (thunk)。”

让我们看看 pcall 是如何工作的,我们从 Eager Furture2 的文档中找到:

"function pcall (thunk &optional (future-type default-future-type)) => future 给定一个没有参数的函数,返回一个对象(称为future) 以后可以用来检索由功能。future-type(默认值 default-future-type)可以是是:渴望,:投机,或:懒惰。请参阅文档default-future-type 用于解释不同的 future 类型。该函数在未指定的动态环境中被调用。”

示例 lisp 代码

;; use quicklisp to add Eager-Future2 to your common lisp
;; implementation in my case I use GVIM, SLIMV and SBCL
(quicklisp:quickload "EAGER-FUTURE2")

(defparameter *future* (eager-future2:pcall #'compute))

*future*

;; Returns non nil if the future values have been computed, nil otherwise
(eager-future2:ready-to-yield? *future*)

;;Returns the computed values, see delayed future, computes the value in current thread,
;;and speculative future computes the future in a current thread if not is evalatuated
;;in another thread.
(eager-future2:yield *future*)




;; function for the long computation, from http://www.cliki.net/fibonacci
(defun fib (n)
"Tail-recursive computation of the nth element of the Fibonacci sequence"
(check-type n (integer 0 *))
(labels ((fib-aux (n f1 f2)
(if (zerop n)
f1 (fib-aux (1- n) f2 (+ f1 f2)))))
(fib-aux n 0 1)))

;; function with no arguments for pcall that computes fibonacci 10000th number
(defun compute ()
(fib 10000))

在 REPL 中使用

SBCL 1.2.4-1.fc21  Port: 4005  Pid: 1188
; SWANK 2014-10-10
CL-USER> (quicklisp:quickload "EAGER-FUTURE2")
To load "eager-future2":
Load 1 ASDF system:
alexandria
Install 3 Quicklisp releases:
bordeaux-threads eager-future2 trivial-garbage
; Fetching #<URL "http://beta.quicklisp.org/archive/trivial-garbage/2013-03-12/trivial-garbage-20130312-git.tgz">
; 8.00KB
==================================================
8,197 bytes in 0.01 seconds (1143.55KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/bordeaux-threads/2013-06-15/bordeaux-threads-0.8.3.tgz">
; 18.31KB
==================================================
18,754 bytes in 0.06 seconds (327.04KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/eager-future2/2011-03-20/eager-future2-0.2.tgz">
; 17.34KB
==================================================
17,758 bytes in 0.07 seconds (262.75KB/sec)
; Loading "eager-future2"
[package bordeaux-threads]........................
[package trivial-garbage].........................
[package eager-future2]..
("EAGER-FUTURE2")
CL-USER> (defun fib (n)
"Tail-recursive computation of the nth element of the Fibonacci sequence"
(check-type n (integer 0 *))
(labels ((fib-aux (n f1 f2) ...))))
FIB
CL-USER> (fib 1000)
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
CL-USER> (fib 10000)
33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875
CL-USER> (defun compute ()
(fib 10000))
COMPUTE
CL-USER> (defparameter *future* (eager-future2:pcall #'compute))
*FUTURE*
CL-USER> *future*
#<EAGER-FUTURE2:FUTURE {1004F20383}>
CL-USER> (eager-future2:ready-to-yield? *future*)
T
CL-USER> (eager-future2:yield *future*)
33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875
CL-USER>

希望对你有用

关于concurrency - 想要一个简单的程序来说明使用线程并发 lisp 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174802/

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