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

Concurrency 想要一个简单的程序来说明使用线程并发lisp的使用吗,concurrency,lisp,common-lisp,sbcl,Concurrency,Lisp,Common Lisp,Sbcl,我只是对lisp编程感到好奇,并想 知道如何通过创建线程来使用并发lisp -我还想清楚lisp中的pcall()函数 对问题的评论为您提供了解决问题的正确方法。我希望这仍然有用 如果您想在common lisp中使用并发,其中一种方法是Earge Future2,但是您可以在这里选择其他模型 正如顾名思义,热切的未来是建立在未来的基础上的 “Eager Future2是一个通用的Lisp库,提供可组合的 统一并行计算和延迟计算的并发原语是 与CL的状态系统集成,并具有自动资源 管理层。 渴望未

我只是对lisp编程感到好奇,并想 知道如何通过创建线程来使用并发lisp

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


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

如果您想在common lisp中使用并发,其中一种方法是Earge Future2,但是您可以在这里选择其他模型

正如顾名思义,热切的未来是建立在未来的基础上的

“Eager Future2是一个通用的Lisp库,提供可组合的 统一并行计算和延迟计算的并发原语是 与CL的状态系统集成,并具有自动资源 管理层。 渴望未来2中并发的基本单位是未来,即 充当无参数值代理的数据类型 同时计算的函数(thunk)。”

让我们看看pcall是如何工作的,从Earge Future2的文档中我们发现:

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

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> 
SBCL 1.2.4-1.fc21端口:4005 Pid:1188
; 斯旺克2014-10-10
CL-USER>(quicklisp:quickload“渴望未来2”)
要加载“渴望未来2”:
加载1 ASDF系统:
亚历山大港
安装3个Quicklisp版本:
波尔多-未来2琐碎的垃圾
; 吸引#
; 8.00KB
==================================================
0.01秒8197字节(1143.55KB/秒)
; 吸引#
; 18.31KB
==================================================
0.06秒内18754字节(327.04KB/秒)
; 吸引#
; 17.34KB
==================================================
0.07秒17758字节(262.75KB/秒)
; 加载“渴望未来2”
[包装波尔多螺纹]。。。。。。。。。。。。。。。。。。。。。。。。
[包装琐碎垃圾]。。。。。。。。。。。。。。。。。。。。。。。。。
[套餐渴望未来2]。。
(“渴望未来2”)
CL-USER>(定义光纤(n)
“斐波那契序列第n个元素的尾部递归计算”
(检查类型n(整数0*))
(标签((fib辅助(n f1 f2)…))
小谎
CL-USER>(fib 1000)
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
CL-USER>(fib 10000)
33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875
CL-USER>(定义计算()
(fib 10000)
计算
CL-USER>(定义参数*未来*(渴望未来2:pcall#'compute))
*未来*
CL-USER>*未来*
#
CL-USER>(渴望未来2:准备好产出?*未来*)
T
CL-USER>(渴望未来2:收益率*未来*)
33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056