cl-scopes/util/async.lisp

49 lines
1.2 KiB
Common Lisp

;;;; cl-scopes/util/async - utilities for asynchronous (concurrent / parallel) operations
(defpackage :scopes/util/async
(:use :common-lisp)
(:local-nicknames (:lp :lparallel)
(:lpq :lparallel.queue))
(:export #:init #:finish #:make-ch #:make-mb #:rcv #:try-rcv #:snd
#:submit-task #:receive-result #:try-receive-result))
(in-package :scopes/util/async)
;;;; general definitions (lparallel wrappers)
(defun init ()
(when (null lp:*kernel*)
(format t "async:init ~a ~%"
(setf lp:*kernel* (lp:make-kernel (serapeum:count-cpus))))))
(defun finish ()
(when lp:*kernel*
(lp:end-kernel)))
;;;; higher-level mailbox / task / channel combination
(defclass mailbox ()
((queue :reader queue :initform (lpq:make-queue))
(channel :reader channel :initform (lp:make-channel))))
(defun make-mb ()
(make-instance 'mailbox))
(defun rcv (mb)
(lpq:pop-queue (queue mb)))
(defun try-rcv (mb)
(lpq:try-pop-queue (queue mb)))
(defun snd (mb msg)
(lpq:push-queue msg (queue mb)))
(defun submit-task (mb job &rest args)
(apply #'lp:submit-task (channel mb) job args))
(defun receive-result (mb)
(lp:receive-result (channel mb)))
(defun try-receive-result (mb)
(lp:try-receive-result (channel mb)))