[Perl] Objecten delen tussen threads

Pagina: 1
Acties:

  • maleadt
  • Registratie: Januari 2006
  • Laatst online: 15-09 20:25
Om een applicatie te multithreaden, moet ik een verschillende threads toelaten om van eenzelfde klasse gebruik te maken. Om het concreet te maken: het gaat om verschillende download threads, die van een proxy manager een proxy url moeten ophalen.

Om dat te verwezenlijken, heb ik een Proxy klasse gemaakt, waarvan de objecten via functies (get, remove, blabla) proxies kunnen ophalen en verwijderen uit een statisch gedeelde proxy cache. Om problemen te vermijden, zijn die lees en schrijf acties van de lokale cache beschermd door een gedeelde semafoor ("$s : shared = Thread::Semaphore->new()"). Het lukt me echter niet om de cache van proxies, het statische element waartoe alle instanties van Proxy toegang moeten toe hebben, te delen. Het is onmogelijk via "threads::shared", aangezien het een complex object is (de variabele als ":shared" declareren zoals de semafoor werkt enkel als het een array/hash/scalar is zonder nested items).

Ik had zelf op twee methodes gekomen, die elk echter niet voldoen. De eerste:
Perl:
1
2
3
4
5
my $test = new Test();

my %shared : shared = (
    test    =>  &share($test),
);

waarbij $test de gedeelde datastructuur voorstelt. De manier van delen werkt aangezien %shared een enkel gelaagde hash is (perfect te delen via :shared dus), maar de consequentie is dat die hash enkel scalars, of shared references mag bevatten. Zo een shared reference maak ik aan via de share() functie, maar hierdoor wordt mijn $test object gewist! Alle data die voorheen via new() aangemaakt is, wordt gewist... Hoe los ik dit op?

De tweede opzet die ik op internet tegen gekomen was, is:
Perl:
1
2
3
4
my $test = new Test();
my %shared : shared = (
    test    =>  address_of($test),
);

Waarbij ik in elke thread test dan derefereer via deref(). Niet echt Perl-ish, en Devel::Pointer blijkt niet eens beschikbaar te zijn bij de meeste distro's...

Iemand enig idee hoe ik een dergelijk object deel, hetzij door er een correcte shareable reference van te maken, hetzij op een andere manier? Alvast bedankt!

  • veldsla
  • Registratie: April 2000
  • Laatst online: 17-09 15:34
Ik heb ook wel eens met perl ithreads gespeeld en kwam ook al snel in de problemen met :shared.

Ik ben toen overgegaan op Thread::Queue en Thread::Queue::Multiplex, daarmee kon ik wel fatsoenlijk data uitwisselen. Ook objecten, maar met limitations, zie docs

Acties:
  • 0 Henk 'm!

  • maleadt
  • Registratie: Januari 2006
  • Laatst online: 15-09 20:25
Bedankt, al blijven het vervelende limitaties. Uiteindelijk toch maar de library herschreven zodat het met eenvoudige hashes werkte, omdat ik maar niet vond hoe een shared ref naar een object te genereren om die in een shared hash op te slaan (zonder daarbij alle inhoud te verwijderen).