newLISP 多进程与多核CPU

newLISP实现了Cilk API, 可以将多个同时运行的进程执行在多处理器或者多核的CPU架构上,已达到并行节省运行时间的目的。

使用spawn和sync函数可以很快的实现。下面是来自newLISP官方文档的例子:

#!/usr/bin/newlisp

; calculate primes in a range
(define (primes from to)
  (local (plist)
      (for (i from to)
          (if (= 1 (length (factor i)))
              (push i plist -1)))
      plist))

; start child processes
(set ‘start (time-of-day))

(spawn ‘p1 (primes 1 1000000))
(spawn ‘p2 (primes 1000001 2000000))
(spawn ‘p3 (primes 2000001 3000000))
(spawn ‘p4 (primes 3000001 4000000))

; wait for a maximum of 60 seconds for all tasks to finish
(sync 60000) ; returns true if all finished in time
; p1, p2, p3 and p4 now each contain a lists of primes

(println "time spawn: " (- (time-of-day) start))
(println "time simple: " (time  (primes 1 4000000)))

(println p1)
(exit)

运行结果是:

time spawn: 5068
time simple: 8614.983
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107
 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223
 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 

现在来解释一下上面的代码:

1. local

(local是一个和(let)差不多的函数,用来初始化变量,区别是(local)将变量都初始化为nil,因此plist的初始值为nil

2. spawn 函数

syntax: (spawn sym exp [true])

sym 用来保存创建的子进程ID

exp 是子进程启动后运行的表达式,这里我们传递的是函数primes构成的表达式

true 是当父子进程通过send/receive函数通信时才需要设置,一般不需要使用该参数

spawn函数会立刻返回,所以等待子进程返回需要使用sync函数。不过要注意,sync函数返回后,子进程计算结果会保存到sym中。

3. sync函数

syntax: (sync int-timeout [func-inlet])
syntax: (sync)

int-timeout 指定等待毫秒数,如上面的60000毫秒,也就是60秒。如果指定时间到达而子进程也结束,sync返回true, 如果子进程届时还没有结束,则sync返回nil.

不管子进程是否完成,sync返回后, 子进程计算结果也会保存到之前spawn返回的pid上。

func-inlet 是可以在sync返回的时候执行的函数或者lambda表达式,参数是子进程id.

4. 用sync来跟踪进度

sync接收的超时时间只是一个估值,可以通过在循环里面多次调用,并指定较短的超时时间来

时间: 2024-10-11 16:10:36

newLISP 多进程与多核CPU的相关文章

浅谈多核CPU、多线程、多进程

1.CPU发展趋势 核心数目依旧会越来越多,依据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的桌面PC有望在2017年末2018年初达到24核心(或者16核32线程),我们如何来面对这突如其来的核心数目的增加?编程也要与时俱进.笔者斗胆预测,CPU各个核心之间的片内总线将会采用4路组相连:),因为全相连太过复杂,单总线又不够给力.而且应该是非对称多核处理器,可能其中会混杂几个DSP处理器或流处理器. 2.多线程与并行计算的区别 (1)多线程的作用不只是用作并行计算,他还有很多很有益的作

多核CPU上python多线程并行的一个假象

GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU.在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU.那如何能让它在双核

python多线程为什么不能利用多核cpu

GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU.在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU.那如何能让它在双核

多核CPU上python多线程并行的一个假象(转)

转自:http://www.cnblogs.com/skying555/p/6527189.html GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU.在我的双

python多线程不能利用多核cpu,但有时候多线程确实比单线程快。

python 为什么不能利用多核 CPU  GIL 其实是因为在 python中有一个 GIL( Global Interpreter Lock),中文为:全局解释器锁.  1.最开始时候设计GIL是为了数据安全 python为了数据安全设计了这个 GIL. 2.每个 CPU在同一时间只能执行一个线程: (在单核 CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念. 但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同

为什么python的多线程不能利用多核CPU?

为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快. 一.python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行,在遇到I/O 操作时会释放这把锁. 如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval 来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处

单核,多核CPU的原子操作

一. 何谓"原子操作":原子操作就是: 不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch). 二. 为什么关注原子操作?1. 如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂贵性能开销的锁. - (巧妙的利用原子操作和实现无锁编程)2. 借助原子操作可以实现互斥锁(mutex). (linux中的mutex_lock_t)3. 借助互斥锁, 可以实现让更多的操作变成原子操作. 三. 单核

linux 多核CPU性能调优

常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源: 这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上,或者是多核的cpu的一颗核心上进行处理,虽然这不一定是最有效的方法,但可以最大程度上利用了有效资源,降低那些不太重要的进程占用cpu资源: 查看系统下cpu信息: cat /proc/cpuinfo taskset就可以帮我们完成这项工作,而且操作非常简单:

利用多核CPU来加速Linux命令 — awk、sed、bzip2、grep、wc

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作--一些无法并行的操作.数据专家们,我是在对你们说.你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核.借用卡通人物Cartman的话,"如何我能使用这些内核"?要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作