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

threads => Grundwissen (Seite 3)

Leser: 4


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

user image
Quote
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...
(Quote von mir)

Mehr brauch ich nicht...macht euch um himmels willen nicht extra solche Arbeit!

Ich werde es mit threads machen. Geht viel schneller, logischer und kuerzer.
Bei mir funktioniert Windows wie Linux das selbe Ergebnis bzgl. Threads. Postitiv - funktioniert!

Also: ich brauche ein Schnipseln, was mir eine simple text-datei in 2(zwei) Variablen speichert.
Bsp: Die Datei hat 10000 Zeilen. Dann macht er halt 5000 in @liste0 und 5000 in @liste1
Dann uebergebe ich das an meinen thread und fertig.
D.h. der thread bekommt @liste2 und der normale prozess @liste0. (Mit threads wird ja eine (Sub)Funktion nur kopiert)
Das muesste doch gehen, nicht?

// Edit: oha mir ist nochn logik fehler aufgefallen.
Vllt. kann einer von euch den loesen. Und zwar wenn ich @liste0 an &abfrage sende und abfrage macht(standard, ohne thread!!)
for($i=0;$i<=5000;$i++) { print @liste0[$i]; }

und ich dann einen neuen thread erstelle:

my $thr = new Thread \&abfrage, $nick, @liste1, $proxy;

Dann macht er die selbe Funktion (abfrage genannt) nur mit @liste0[$i] durch obwohl er mit @liste1[$i] machen sollte :/ boah
D.h. ich muesste ueberpruefen ob der thread es macht

Wenn der thread die Akton durchfuehrt, dann

for($i=0;$i<=5000;$i++) { print @liste1[$i]; }

wenn nicht dann

for($i=0;$i<=5000;$i++) { print @liste0[$i]; }

Kurz und knapp: Wie kann ich ermitteln ob man im thread "steckt"?
Weil der Thread soll ja eine andere Daten aus der Liste holen.

Achja: fork() wäre dafuer mehr als ungeeignet, weil ich doch zwei >>>verschiedene<<< Teile der Liste abfrage.\n\n

<!--EDIT|RPerl|1169579693-->
renee
 2007-01-23 22:47
#73453 #73453
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Datei in zwei verschiedene Arrays:
Code: (dl )
1
2
3
4
5
6
7
8
9
use Tie::File;

my $file = '/path/to/large.file';
my (@array_1, @array_2);
tie my @array,'Tie::File',$file or die $!;
my $index = int(scalar(@array) / 2);
@array_1 = @array[0..$index];
@array_2 = @array[$index+1..$#array];
untie @array;
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/
ptk
 2007-01-24 01:31
#73454 #73454
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=topeg,23.01.2007, 05:36]Unter Linux gibt es zwar Threads (pthreads,NGPT), aber die werden in dem Threadmodul nicht berücksichtig, so weit ich weiß.[/quote]
Doch, es werden schon Linux-Threads verwendet. Aber in Perl besitzt jeder Perl-Thread den kompletten Interpreter und der Speicher wird *nicht* zwischen Perl-Threads geteilt, so dass es sich so anfüllt, als ob nicht die normale Thread-Implementierung verwendet wird.
esskar
 2007-01-24 02:17
#73455 #73455
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=ptk,24.01.2007, 00:31]Doch, es werden schon Linux-Threads verwendet. Aber in Perl besitzt jeder Perl-Thread den kompletten Interpreter und der Speicher wird *nicht* zwischen Perl-Threads geteilt, so dass es sich so anfüllt, als ob nicht die normale Thread-Implementierung verwendet wird.[/quote]
verhält sich dann wie das windows-fork. witzig :)
RPerl
 2007-01-24 18:01
#73456 #73456
User since
2006-11-26
384 Artikel
BenutzerIn

user image
@ renee: noch nicht getestet, aber wenn das funktioniert. Top, genau das was ich suchte.

// EDIT: Hab renees script getestet. Funktioniert PERFEKT! großes Dankeschoen!

Aber eine Frage bleibt absolut offen: Wie pruefe ich ob ich im thread bin?
Weil die standard abfrage Funktion sieht so aus:

Code (perl): (dl )
1
2
3
4
5
sub abfrage() {
for(my $i=0;$i<=5000;$i++) {  
print @array_1[$i]; #  === ACHTUNG, Logik Problem ===
}
}

Das sind ist die erste Haelfte der Datei. Und wie mach ich die andere Haelfte im Thread? (@array_2)
Versteht ihr das Logikproblem?\n\n

<!--EDIT|RPerl|1169655001-->
renee
 2007-01-24 18:14
#73457 #73457
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use threads;

sub abfrage{
my ($arref) = @_;
for my $element(@$arref){
print $element;
}
}


my $thread1 = thread->create('abfrage',\@array_1);
my $thread2 = $thread->create('abfrage',\@array_2);


(ungetestet!)
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-24 18:47
#73458 #73458
User since
2006-11-26
384 Artikel
BenutzerIn

user image
hööööööööö?
Ich kriege nun krasse Fehler. habe zwischenzeitlich auf activeperl 5.6.1 downgraded.
?????
Nun kriege ich mal Fehler mal nicht?!

Fehler 1:
Quote
Can't undef active subroutine during global destruction.


Script 1:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use threads;


$thr = threads->new(\&sub1);

sub sub1() 
{
}

my @ReturnData = $thr->join;
print @ReturnData;


Fehler 2: Can't locate object method "new" via package "Thread" (perhaps you forgot to load "Thread"?)
Script 2:
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
#!/usr/bin/perl 

use Tie::File;
use threads;

my $file = 'german.txt';
my (@array_1, @array_2);
tie my @array,'Tie::File',$file or die $!;

my $index = int(scalar(@array) / 2);

@array_1 = @array[0..$index];
@array_2 = @array[$index+1..$#array];

untie @array;


sub abfrage{
   my ($arref) = @_;
   for my $element(@$arref){
       print $element;
   }
}

my $thr = new Thread \&abfrage, @array_1;
my $thr = new Thread \&abfrage, @array_2;
\n\n

<!--EDIT|RPerl|1169657448-->
nepos
 2007-01-24 19:51
#73459 #73459
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich glaube, du vermischt hier grade die neue und die alte Syntax fuer Threads.
Wenn du use threads; schreibst, dann gehen die letzten beiden Zeilen so:
Code (perl): (dl )
1
2
my $thr1 = threads->create(\&abfrage,@array_1);
my $thr2 = threads->create(\&abfrage,@array_2);

Einen Funktion new zum Erzeugen eines neuen Threads gibt es hier nicht. Wie gesagt musst du dazu create benutzen.
RPerl
 2007-01-27 16:37
#73460 #73460
User since
2006-11-26
384 Artikel
BenutzerIn

user image
@renee: Ich hab doch noch eine Frage, weil ich deinen code mit der foreach da nicht kapiere.
Also in meiner Funktion &abfrage muss ich beide arrays bearbeiten. Sicher das dein code das macht?
Wenn ja kannst du es mal anpassen fuer @liste_1 und @liste_2 ??\n\n

<!--EDIT|RPerl|1169908701-->
renee
 2007-01-27 16:47
#73461 #73461
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Welchen Code meinst Du?
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.