Thread-basierter Server in Perl

Thread-basierter Server in Perl

am 10.09.2006 14:52:40 von Meinhard Schneider

Hallo,

ich möchte gerne einen kleinen Server schreiben. Der soll aus zwei
Threads bestehen. Der erste Thread sammelt Daten (im Endeffekt lese ich
in einem bestimmten Abstand was von der seriellen Schnittstelle und
schlafe dann längere Zeit). Der zweite Thread soll einen kleinen
TCP-Server beherbergen. Wenn man sich verbindet, soll er einfach die
Messdaten ausspucken.

Meine Idee war jetzt (so würde ich das in C lösen), dass ich eine
gemeinsame Variable habe, auf die von beiden Threads zugegriffen wird
(mit passendem Locking usw.). Unter Perl scheint das mit ithreads ja
nicht so ohne weitere möglich zu sein. Bei mir scheitert es im Moment
schon mal daran, dass ich keine Objekte share'en kann/darf. Genau das
brauche ich aber (die Messwerte stecken in einer Art Ringbuffer).

Hat jmd. eine Idee, wie man sowas in Perl umsetzt?

Kann ich unter Perl native POSIX-Threads nutzen (ich konnte auf
search.cpan.org nicht dazu finden)?

Auch wäre ich sehr dankbar über Links/Literaturverweise zu dem Thema!

Bye
Meinhard

Re: Thread-basierter Server in Perl

am 10.09.2006 21:26:50 von Slaven Rezic

Meinhard Schneider writes:

> Hallo,
>
> ich möchte gerne einen kleinen Server schreiben. Der soll aus zwei
> Threads bestehen. Der erste Thread sammelt Daten (im Endeffekt lese
> ich in einem bestimmten Abstand was von der seriellen Schnittstelle
> und schlafe dann längere Zeit). Der zweite Thread soll einen kleinen
> TCP-Server beherbergen. Wenn man sich verbindet, soll er einfach die
> Messdaten ausspucken.
>
> Meine Idee war jetzt (so würde ich das in C lösen), dass ich eine
> gemeinsame Variable habe, auf die von beiden Threads zugegriffen wird
> (mit passendem Locking usw.). Unter Perl scheint das mit ithreads ja
> nicht so ohne weitere möglich zu sein. Bei mir scheitert es im Moment
> schon mal daran, dass ich keine Objekte share'en kann/darf. Genau das
> brauche ich aber (die Messwerte stecken in einer Art Ringbuffer).

Du könntest vielleicht Storable verwenden und damit das Objekt in
einen handlichen String umwandeln. Das könnte man das zwischen den
Threads hin- und her transportieren. Natürlich bedeutet das erhöhten
Verwaltungsaufwand und geringere Performance.

>
> Hat jmd. eine Idee, wie man sowas in Perl umsetzt?
>
> Kann ich unter Perl native POSIX-Threads nutzen (ich konnte auf
> search.cpan.org nicht dazu finden)?

Das alte Thread-Modell (5005threads) ist näher an den POSIX-Threads
dran. Aber es hat sich gezeigt, dass dieses Modell nicht gut mit den
Perl-Interna zusammenspielt (zu unzuverlässig, zu buggy).

Unter Perl gehen solche Sachen mit select() oder fork() besser.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de
BBBike - route planner for cyclists in Berlin
WWW version: http://www.bbbike.de
Perl/Tk version for Unix and Windows: http://bbbike.sourceforge.net