From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: =?UTF-8?Q?Elias_M=C3=A5rtenson?= Newsgroups: gmane.emacs.devel Subject: Threading IO-bound functions Date: Thu, 15 Dec 2016 12:01:51 +0800 Message-ID: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=001a114ac30e6c2e430543aa83ca X-Trace: blaine.gmane.org 1481774582 7782 195.159.176.226 (15 Dec 2016 04:03:02 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Thu, 15 Dec 2016 04:03:02 +0000 (UTC) To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Dec 15 05:02:58 2016 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cHNFx-000142-RY for ged-emacs-devel@m.gmane.org; Thu, 15 Dec 2016 05:02:58 +0100 Original-Received: from localhost ([::1]:52099 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cHNG2-0004dz-1H for ged-emacs-devel@m.gmane.org; Wed, 14 Dec 2016 23:03:02 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33143) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cHNFv-0004YP-Uu for emacs-devel@gnu.org; Wed, 14 Dec 2016 23:02:56 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cHNFs-0002Fz-T8 for emacs-devel@gnu.org; Wed, 14 Dec 2016 23:02:56 -0500 Original-Received: from mail-qk0-f175.google.com ([209.85.220.175]:36519) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cHNFs-0002Fl-Oh for emacs-devel@gnu.org; Wed, 14 Dec 2016 23:02:52 -0500 Original-Received: by mail-qk0-f175.google.com with SMTP id n21so43938704qka.3 for ; Wed, 14 Dec 2016 20:02:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=O3HinkxkZFQcl716aOSWwSpVB5qlny/fRHL1Aupgy5A=; b=QaGu1rqYrC14p9tlMW2gVzEg8FXWL1/MID0d93+3Fg5kTTzFmvcrWP6Ew/Nc5H7PZB CfNl6VxQhBql+cNlOX+6mYZEEFi8+jeHEQe+eEd+8XY6XUGIvxuMacQD+ABb0dpmgcZc NjBw2K3QLApIO1AoAOEX86rMg3RhO1GJ1kFYmYbfMEWo8A5wc2AdKRTl6miOJVpMFcz9 B8gzMJXBKNUO+jHNOtvOiqejkJp1ohFuNEDAreYSNMT+Qu5cW+7XitGKgxS3eV0IbMK2 WXVFWGYPJvY/ZHeSS9sBAeFu3GGIppfPpbfwvLszSlR8xzHN5jR8EUNYY4f/anLnLoCH pwZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=O3HinkxkZFQcl716aOSWwSpVB5qlny/fRHL1Aupgy5A=; b=uda+9G335mR3V5mGNCHctt+EMrSKn7HL7B7rWMMAGuEDyeX9BiSIU79gXwjFQUNDv9 aC4JCBZLX04esOmgADAqNizPYUw4LgAMsJftHIY2edYP7A+7TR107EzGcGoTOqxowEQ6 n4czqDchb/jeONrYmCbAqYRv2DcilY79CrD7SMeFga1LmtgQcUx/dMUq4LHjALsyTxbq fU3MSTXhjmi9A5JK9XpS1o7DnkQ/eLFO9upyY5Oj9hCDOQSZV+J5+HQfpv0T3SLSoXYP ciGDDUMYwzvjWehMPGdLRGkIgcPhzs4Mj+qOZUAUisugAfH9QkdEuEgyeLelFBqa50Bn LvhQ== X-Gm-Message-State: AIkVDXIfvwZkdEMgymtYUE6Nj8IfTJ+BusOH72y2YtdD4piFiCuPo9fmYWZD411V+k2Wm9uTxBYvZCVNAh68gQ== X-Received: by 10.55.67.74 with SMTP id q71mr196494qka.292.1481774511957; Wed, 14 Dec 2016 20:01:51 -0800 (PST) Original-Received: by 10.55.110.5 with HTTP; Wed, 14 Dec 2016 20:01:51 -0800 (PST) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.220.175 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:210470 Archived-At: --001a114ac30e6c2e430543aa83ca Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable The number one function that I call that sometimes hang for a significant amount of time is =E2=80=98gnus=E2=80=99. I decided to try running it in a = thread, and it worked surprisingly well. Initial loading of the messages can now be done in the background. To prevent myself from running this function more than once at the same time, I created a wrapper function for this, and I have extracted it into a macro. I'd like to have people's opinions on this strategy, and if it might be reasonable to default =E2=80=98gnus=E2=80=99 to do this when run on Emacs v= ersions with concurrency support. (defmacro define-background-function-wrapper (bg-function fn) (let ((is-loading-sym (intern (concat "*" (symbol-name bg-function) "-is-loading*")))) `(progn (defvar ,is-loading-sym nil) (defun ,bg-function () (interactive) (when ,is-loading-sym (message ,(concat (symbol-name fn) " is already loading"))) (setq ,is-loading-sym t) (make-thread (lambda () (unwind-protect (,fn) (setq ,is-loading-sym nil)))))))) It's invoked like =E2=80=98(define-background-function-wrapper bg-gnus gnus= )=E2=80=99. This will then define the function =E2=80=98bg-gnus=E2=80=99 that runs =E2=80=98= gnus=E2=80=98 in a thread. Regards, Elias --001a114ac30e6c2e430543aa83ca Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
The number one function that I call that sometimes hang fo= r a significant amount of time is =E2=80=98gnus=E2=80=99. I decided to try = running it in a thread, and it worked surprisingly well. Initial loading of= the messages can now be done in the background.

To prev= ent myself from running this function more than once at the same time, I cr= eated a wrapper function for this, and I have extracted it into a macro.

I'd like to have people's opinions on this s= trategy, and if it might be reasonable to default =E2=80=98gnus=E2=80=99 to= do this when run on Emacs versions with concurrency support.

(defmacro define-background-function-wrapper (bg-funct= ion fn)
=C2=A0 (let ((= is-loading-sym (intern (concat "*" (symbol-name bg-function) &quo= t;-is-loading*"))))
=C2=A0 =C2=A0 `(progn
=C2=A0 =C2=A0 =C2=A0 =C2=A0(defvar ,is-loading-sym nil)
=C2=A0 =C2=A0 =C2=A0 =C2=A0(defun ,bg-= function ()
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0(interactive)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(when ,is-loading-sym
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0(message ,(concat (symbol-name fn) " is already loadi= ng")))
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0(setq ,is-loading-sym t)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(make-thread (= lambda ()
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (= unwind-protect
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 (,fn)