Toon posts:

[Perl] linebreak ($\) within multiple threads

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben in perl (v5.8.2 built for i686-linux-thread-multi) een netwerk proggie aan het schrijven welke in meerdere threads tegelijk van meerdere file-descriptors leest.

Het probleem is echter dat niet voor elke read actie dezelfde line break moet worden gehanteerd. Bij het lezen van een HTTP-header bijvoorbeeld wil ik per lijn lezen welke middles een \r\n gescheiden is. Bij het lezen van unix files over de sockets wil ik een \n delimeter gebruiken. Maar aangezien de default perl line-delimeter variable ($\) een globale variable is wordt dat in een multi-threaded omgeving vrij lastig.

Perl:
1
2
3
4
5
6
7
8
9
10
11
# test-thread-1:
{
    $\ = "\r\n";
    print while (<$file_handle1>);
}

# test-thread-2:
{
    $\ = "\n";
    print while (<$file_handle2>);
}


Dit gaat waarschijnlijk niet werken als het gelijktijdig wordt uitgevoerd. Iemand enig idee wat hiervoor een goede oplossing zou kunnen zijn?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-05 18:13
Naar mijn mening is threading in Perl al vragen om problemen. Misschien is het makkelijker om met aparte processen te werken en via IPC de threads met elkaar te laten communiceren (voor zover dat noodzakelijk is)? Je kunt met de IPC::Shareable bijvoorbeeld vrij makkelijk variabelen delen tussen processen door ze in shared memory te plaatsen en te tie-en aan variabelen in de lokale Perl processen.

edit:
Ik geloof trouwens dat je dat soort variabelen ook lokaal kunt definiëren en dat dan de waarde van de variabele in de lokale scope gebruikt wordt. In jouw voorbeeld zou deze code dan wel moeten werken:
Perl:
1
2
3
4
5
6
7
8
9
10
11
# test-thread-1:
{
    local $\ = "\r\n";
    print while (<$file_handle1>);
}

# test-thread-2:
{
    local $\ = "\n";
    print while (<$file_handle2>);
}


Als dit inderdaad zo werkt dan is je probleem natuurlijk al opgelost en hoef je verder niet moeilijk te doen. :)

[ Voor 40% gewijzigd door Soultaker op 25-07-2004 15:51 ]


Verwijderd

Topicstarter
dat zou heel mooi zijn, gaan we eens proberen.

thanx :)

-----------------------------------
edit:
Yep, seems to work.

[ Voor 37% gewijzigd door Verwijderd op 25-07-2004 16:05 ]