Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8274[/thread]

parallele filehandles



<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
Gast Gast
 2006-08-28 12:57
#69275 #69275
problem abstract: filehandles in threads
so im prinzip funktioniert der code - solange es nur einen thread gibt. Bei mehreren Threads hängt sich das programm auf. Wenn ich statt open() system() verwende funktionieren auch mehrere threads wunderbar - leider will ich aber den output des programms pipen und weiterverarbeiten. Da ich in jedem thread "my $fh" verwende, also ein scalar, sollte der auch für jeden thread unique sein.. irgendwie klappts aber halt doch nicht - lock problem? lösungsvorschläge? :-)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl -w

use strict;
use threads;

sub SubFunction;

print "main: ".threads->tid."\n";
my $thread;
$thread = threads->new(\&SubFunction, "localhost");
$thread = threads->new(\&SubFunction, "localhost");
$thread = threads->new(\&SubFunction, "localhost");
$thread = threads->new(\&SubFunction, "localhost");
$thread = threads->new(\&SubFunction, "localhost");

# loop through threads and wait for remaining
foreach $thread (threads->list) {
#print "remaining threads: ".threads->list."\n";
if ($thread->tid && !threads::equal($thread, threads->self)) {
$thread->join; # join childs only
}
}


sub SubFunction {
print "- thread: ".threads->tid."\n";
#system("ping $_[0]");

my $fh;
open($fh, '-|', "ping.exe $_[0]") or die "couldn't open pipe!";
print while (<$fh>);
close($fh);
}
esskar
 2006-08-28 13:10
#69276 #69276
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl -w

use strict;
use threads;

sub SubFunction;

print "main: ".threads->tid."\n";
threads->new(\&SubFunction, "localhost");
threads->new(\&SubFunction, "localhost");
threads->new(\&SubFunction, "localhost");
threads->new(\&SubFunction, "localhost");
threads->new(\&SubFunction, "localhost");

# loop through threads and wait for remaining
foreach my $thread (threads->list) {
#print "remaining threads: ".threads->list."\n";
if ($thread->tid && !threads::equal($thread, threads->self)) {
$thread->join; # join childs only
}
}


sub SubFunction {
print "- thread: ".threads->tid."\n";
#system("ping $_[0]");

my $fh;
open($fh, '-|', "ping.exe $_[0]") or die "couldn't open pipe!";
print while (<$fh>);
close($fh);
}


macht sinn, oder?
montii
 2006-08-28 14:05
#69277 #69277
User since
2006-08-28
13 Artikel
BenutzerIn
[default_avatar]
:rock: okay...
aber ob ich da jetzt jedesmal einen scalar davorsetze oder nicht spielt eigentlich keine rolle, oder? .. ein neuer thread ist es trotzdem :-) Und in der foreach schleife wird "$thread" eh wieder neu definiert für den aktuellen gültigkeitsbereich.

--> the problem persists
mit system() geht alles, mit open() nichts.

Ausgabe:
C:\... > perl newThreadsTests.pl
main: 0
- thread: 1
<stuck!>\n\n

<!--EDIT|montii|1156759647-->
renee
 2006-08-28 14:27
#69278 #69278
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=montii,28.08.2006, 12:05][...] Und in der foreach schleife wird "$thread" eh wieder neu definiert für den aktuellen gültigkeitsbereich.
[...][/quote]
Nö, Du verwendest den Skalar, der weiter oben mal deklariert wurde...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
montii
 2006-08-28 14:42
#69279 #69279
User since
2006-08-28
13 Artikel
BenutzerIn
[default_avatar]
foreach my $thread (threads->list) { ... }
$thread wird hier neu deklariert und neuer speicher alloziert. Nicht? Anyway.. das Problem liegt woanders :-/
renee
 2006-08-28 14:51
#69280 #69280
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Guest,28.08.2006, 10:57]
Code: (dl )
1
2
3
foreach $thread (threads->list) {

}
[/quote]
hast Du nicht geschrieben...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
montii
 2006-08-28 14:59
#69281 #69281
User since
2006-08-28
13 Artikel
BenutzerIn
[default_avatar]
[quote=renee,28.Aug..2006, 12:51][quote=Guest,28.08.2006, 10:57]
Code: (dl )
1
2
3
foreach $thread (threads->list) {

}
[/quote]
hast Du nicht geschrieben...[/quote]
oops. my bad!
hab den kompletten code von esskar kopiert gehabt weil die änderungen nicht sofort ersichtlich (bunt,..) waren :-) Ein "my" wäre da natürlich wünschenswert gelesen.. das muss ich wohl verplant haben :-(\n\n

<!--EDIT|montii|1156762832-->
esskar
 2006-08-28 15:43
#69282 #69282
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=montii,28.08.2006, 12:59]Ein "my" wäre da natürlich wünschenswert gelesen.. das muss ich wohl verplant haben :-([/quote]
ja ja, aber erstmal mäkern!
montii
 2006-08-28 15:51
#69283 #69283
User since
2006-08-28
13 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,28.Aug..2006, 13:43][quote=montii,28.08.2006, 12:59]Ein "my" wäre da natürlich wünschenswert gelesen.. das muss ich wohl verplant haben :-([/quote]
ja ja, aber erstmal mäkern![/quote]
bitte?? das ist deine interpretation.. ich habe nirgends gemeckert.

davon mal abgesehen fand ich "macht sinn, oder?" sehr arrogant. Bevor dass hier ausartet suche ich mir wohl besser woanders hilfe?
Crian
 2006-08-28 16:21
#69284 #69284
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Nicht gleich die Flinte ins Korn werfen. Ich empfand "macht Sinn, oder" eigentlich nicht arrogant, auch wenn ich das anders formuliert hätte. Ob es arrogant ist oder nicht, kommt dabei auf den Tonfall an, den man leider nicht dazu hört. Genauso fand ich Montiis Einwurf nicht sehr meckerig bzw. verstand esskars Antwort eher als zwinkernden Ratschlag. Geht euch nicht an die Gurgeln nur weil ihr Dinge in die Texte des anderen interpretiert, die gar nicht da sind (denk ich mal).
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2006-08-28 12:57.