Chr*_*ris 8 parallel-processing scheme racket
问题标题说明了一切,真的:在球拍中将一个函数映射到列表中的最佳方法是什么?谢谢.
如果您的意思是多个处理器核心,那么最常用的方法是使用Places.
Places支持开发并行程序,利用具有多个处理器,内核或硬件线程的计算机.
一个地方是一个并行任务,实际上是一个独立的Racket虚拟机实例.场所通过场所通道进行通信,场所通道是双向缓冲通信的端点.
您可能能够使用其他的并行化技术,期货,但条件为它工作都比较有限,例如浮点运算,如所描述这里.
编辑:回应评论:
在某处使用地方是否有并行映射的实现?
首先,我应该备份.你可能不需要地方.您可以使用Racket线程获得并发性.例如,这是一个map/thread
:
#lang racket
(define (map/thread f xs)
;; Make one channel for each element of xs.
(define cs (for/list ([x xs])
(make-channel)))
;; Make one thread for each elemnet of xs.
;; Each thread calls (f x) and puts the result to its channel.
(for ([x xs]
[c cs])
(thread (thunk (channel-put c (f x)))))
;; Get the result from each channel.
;; Note: This will block on each channel if not yet ready.
(for/list ([c cs])
(channel-get c)))
;; Use:
(define xs '(1 2 3 4 5))
(map add1 xs)
(map/thread add1 xs)
Run Code Online (Sandbox Code Playgroud)
如果正在完成的工作涉及阻塞,例如I/O请求,这将给你"并行性",意思是不会卡在I/O上.但是,Racket线程是"绿色"线程,因此一次只能使用一个CPU.
如果您确实需要并行使用多个CPU内核,那么您将需要Futures或Places.
由于Places的实现方式---有效地作为Racket的多个实例---我不会立即看到如何编写泛型map/place
.有关以"定制"方式使用地点的示例,请参阅: