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

threads => Grundwissen (Seite 2)

Leser: 4


<< |< 1 2 3 4 5 6 >| >> 51 Einträge, 6 Seiten
RPerl
 2007-01-22 19:48
#73442 #73442
User since
2006-11-26
384 Artikel
BenutzerIn

user image
hab noch was hinzugefuegt... siehe oben..
ka ob du das mitgelesen hast?!

// edit nochmal:

waers nicht besser @topeq @all, wenn ich die Testdatei in 2 Variablen teile?
Also sagen wir die Liste hat 50 Zeilen.
50:2 = 25
$variable1=25 Zeilen
$variable2=die nächsten 25 Zeilen

Dann mach ich:
Code: (dl )
1
2
3
my $thread1 = $thread->create(sub { print "I am a thread1"},$variable1);

my $thread2 = $thread->create(sub { print "I am a thread2"},$variable2);


Btw: entschuldigung wenn ich etwas laenger brauche. Bin nur ein normaler Mensch - ich denke *noch* nicht perlisch :D

// Edit 2:
Das problem bei fork() ist, dass ich wieder zweimal den selben code paste'n muesste...\n\n

<!--EDIT|RPerl|1169488513-->
renee
 2007-01-22 19:54
#73443 #73443
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dass da zwei unterschiedliche Funktionsnamen stehen wird ein Flüchtigkeitsfehler gewesen sein. Du musst nach der Schleife überprüfen, ob alle Zeilen verarbeitet wurden. Sonst werden nur alle Zeilen verarbeitet wenn die Datei genau 10, 20, 30 oder 40 Zeilen (usw.) hat. Wenn Du aber eine Datei mit 13 Zeilen hast, werden ohne Zeile 16 die letzten 3 Zeilen nicht verarbeitet...
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/
RPerl
 2007-01-22 19:59
#73444 #73444
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Quote
Dass da zwei unterschiedliche Funktionsnamen stehen wird ein Flüchtigkeitsfehler gewesen sein.

Aber selbst wenn es das ist, dann geht es doch immer noch nicht. Denn woher soll der thread denn wissen was er *genau* verarbeiten muss..

Guck dir mal meinen Edit an, wo ich von $variable1=25, $variable2=25 blablubb rede. Koennte man sowas nicht machen?
Waer doch eigl. logisch gesehen der leichteste Weg oder nicht?
renee
 2007-01-22 20:18
#73445 #73445
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=RPerl,22.01.2007, 18:48][...]

// Edit 2:
Das problem bei fork() ist, dass ich wieder zweimal den selben code paste'n muesste...[/quote]
Wieso??
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/
RPerl
 2007-01-22 20:23
#73446 #73446
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Eine andere Moeglichkeit waere, wenn ichs mit fork in Verbindung mit Subfunktionen erledigen wuerde :)

Code: (dl )
1
2
3
4
5
6
if($pid == 0){
&abfrage($die_ersten_~100_zeilen); # child prozess muesste das sein, oder?
}
else{
&abfrage($die_naechsten_~100_zeilen); # parentprozess muesste das sein, oder?
}


Ich glaube so wuerde es auch gehen.

Aber ich komme nicht drumrum, die Datei zu teilen, zeilenweise.
Weisst du, wie ich das mache?
Das Codeschnipsel muesste die Liste zeilenweise einlesen, dann in 2 gleichgroße Stuecke teilen und jeweils in variablen packen.
Dann waer mir >__wahrscheinlich__< geholfen...\n\n

<!--EDIT|RPerl|1169490374-->
topeg
 2007-01-22 22:09
#73447 #73447
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Allso noch etwas ausführlicher.
Ich habe keine Möglichkeit das irgendwie zu testen (nutze nur Linux) wenn allso der Thread-aufruf irgendwie falsch ist, dann korrigiert das bitte.
Code (perl): (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
34
35
36
37
use Thread;

#...

sub verarbeite_10_zeilen_in_thread($)
{ return Thread->new(\&verarbeite_10_zeilen,$_[0]); }

sub verarbeite_10_zeilen($)
{
  my @zeilen=@$_[0];
  # mach hier was du willst
  return("irgendwas", 42);
}

my @threads;

my @ten_lines;
my $cnt=0;
open(DAT,'<',$datei) or die $!;
while(my $line=<DAT>)
{
  push(@ten_lines,$line);
  $cnt++;
  if($cnt>=10)
  {
   $cnt=0;
   push(@threads,&verarbeite_10_zeilen_in_thread([@ten_lines]));
   @ten_lines=();
  }
}
# übrig geblibenen Zeilen verarbeiten
push(@threads,&verarbeite_10_zeilen_in_thread([@ten_lines])); if(@ten_lines>0);
close(DAT);

my @back;
push(@back,[$thread->join()]) for my $thread (@threads);
mach irgendwas mit den zurückgebenen Werten in @back ...


Das mit den Funktionen war ein Flüchtigkeitsfehler.\n\n

<!--EDIT|topeg|1169496673-->
esskar
 2007-01-23 00:04
#73448 #73448
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=topeg,22.01.2007, 21:09](nutze nur Linux)[/quote]
funzen Threads nicht auch unter Linux?
topeg
 2007-01-23 06:36
#73449 #73449
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Unter Linux gibt es zwar Threads (pthreads,NGPT), aber die werden in dem Threadmodul nicht berücksichtig, so weit ich weiß.
renee
 2007-01-23 08:47
#73450 #73450
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=renee,22.01.2007, 18:42]Die Threads, die in dem von Dir verlinkten perldoc gezeigt werden sind veraltet. Es gibt Perldoc:threads und im aktuellen Perldoc:perlthrtut ist auch nur noch von threads die Rede.

].[/quote]
...

Allerdings muss Perl auch so kompiliert werden, dass es Threads unterstützt.
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/
renee
 2007-01-23 09:14
#73451 #73451
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hier mal etwas mit fork:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#! /usr/bin/env perl

use strict;
use warnings;
use Getopt::Long;
use POSIX ":sys_wait_h";

GetOptions('-i=s' => \my $infile);

my ($counter,$index,@lines) = (1,0);

open my $fh,"<",$infile or die "Can't open $infile: $!";
while(my $line = <$fh>){
push @{$lines[$index]},$line;
$index++ if $counter++ % 10 == 0;
}

fork_it(\@lines);


#------------------------------------------#
# Subroutines #
#------------------------------------------#



sub do_something_with_lines{
my ($lines,$nr) = @_;
print $nr,": ",$_ for @$lines;
}


sub fork_it{
my ($linesref) = @_;

my %pids;

for (1..scalar(@$linesref)){
my $pid=fork();
if($pid==-1){
warn($!);
last;
}
if($pid){
$pids{$pid}=1;
}
else{
do_something_with_lines($linesref->[$_-1],$_-1);
exit(0);
}
}
while(keys %pids){
my $pid=waitpid( -1, WNOHANG );
die "$!" if $pid == -1;
delete $pids{$pid};
}
}
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/
<< |< 1 2 3 4 5 6 >| >> 51 Einträge, 6 Seiten



View all threads created 2007-01-21 18:07.