Thread: best way to implement producer/consumer in Perl

best way to implement producer/consumer in Perl

From
Vivek Khera
Date:
I've got an application that creates work and posts the work requests
to a table.  Each work request is just a single row in the table.
I've also got two systems that do the work based on the requests in
the table.

It seems that ideally, I could use the LISTEN/NOTIFY features to tell
the consumers when there is work.  However, what I really need is a
blocking LISTEN.  That is, it just sits there until it gets a NOTIFY.

Right now, the consumer checks for work every so often, and most of
the time finds none.

What's the best way to implement such a thing in Perl?  Is there a
blocking LISTEN?


--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Vivek Khera, Ph.D.                Khera Communications, Inc.
Internet: khera@kciLink.com       Rockville, MD       +1-240-453-8497
AIM: vivekkhera Y!: vivek_khera   http://www.khera.org/~vivek/

Re: best way to implement producer/consumer in Perl

From
Joel Burton
Date:
On 2 May 2001, Vivek Khera wrote:

> I've got an application that creates work and posts the work requests
> to a table.  Each work request is just a single row in the table.
> I've also got two systems that do the work based on the requests in
> the table.
>
> It seems that ideally, I could use the LISTEN/NOTIFY features to tell
> the consumers when there is work.  However, what I really need is a
> blocking LISTEN.  That is, it just sits there until it gets a NOTIFY.
>
> Right now, the consumer checks for work every so often, and most of
> the time finds none.
>
> What's the best way to implement such a thing in Perl?  Is there a
> blocking LISTEN?

I'm not a serious expert on such things, but, in Perl, LISTEN/NOTIFY is
handled through DBI/DBD, so the LISTEN/NOTIFY notification will come
only when a regular query is sent.

Could you possibly do something like:

while (1) {
  execute regular, simple query (eg "SELECT 1;")
  check for notification, and handle it
  sleep for x minutes/seconds/msecs
}

It's still a loop w/a query, but at least the query should be extremely
speedy and have low impact on DB performance.

If you find a better way, please let me know.

HTH,
--
Joel Burton   <jburton@scw.org>
Director of Information Systems, Support Center of Washington