Re: What happens if I create new threads from within a postgresql function?

From: Merlin Moncure <mmoncure(at)gmail(dot)com>
To: Seref Arikan <serefarikan(at)kurumsalteknoloji(dot)com>
Cc: PG-General Mailing List <pgsql-general(at)postgresql(dot)org>
Subject: Re: What happens if I create new threads from within a postgresql function?
Date: 2013-02-18 15:56:22
Message-ID: CAHyXU0yXEVESLCR0H9ti_Md+JGj7ZmNnnMhnZUzxgV+sHcTQ5A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Mon, Feb 18, 2013 at 5:10 AM, Seref Arikan
<serefarikan(at)kurumsalteknoloji(dot)com> wrote:
> Greetings,
> What would happen if I create multiple threads from within a postgresql
> function written in C?
> I have the opportunity to do parallel processing on binary data, and I need
> to create multiple threads to do that.
> If I can ensure that all my threads complete their work before I exit my
> function, would this cause any trouble ?
> I am aware of postgresql's single threaded nature when executing queries,
> but is this a limitation for custom multi threaded code use in C based
> functions?
> I can't see any problems other than my custom spawn threads living beyond my
> function's execution and memory/resource allocation issues, but if I can
> handle them, should not I be safe?
>
> I believe I've seen someone applying a similar principle to use GPUs with
> postgresql, and I'm quite interested in giving this a try, unless I'm
> missing something.

Some things immediately jump to mind:
*) backend library routines are not multi-thread safe. Notably, the
SPI interface and the memory allocator, but potentially anything. So
your spawned threads should avoid calling the backend API. I don't
even know if it's safe to call malloc.

*) postgres exception handling can burn you, so I'd be stricter than
"before I exit my function"...really, you need to make sure threads
terminate before any potentially exception throwing backend routine
fires, which is basically all of them including palloc memory
allocation and interrupt checking. So, we must understand that:

While your threads are executing, your query can't be cancelled --
only a hard kill will take the database down. If you're ok with that
risk, then go for it. If you're not, then I'd thinking about
sendinging the bytea through a protocol to a threaded processing
server running outside of the database. More work and slower
(protocol overhead), but much more robust.

merlin

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Magnus Hagander 2013-02-18 16:21:19 Re: could not link file "pg_xlog/xlogtemp.72606"
Previous Message Albe Laurenz 2013-02-18 15:48:48 Re: Immutable functions, Exceptions and the Query Optimizer