Date: Sat, 1 Oct 2005 15:58:49 -0400 (EDT) From: John Gillis <zefram@zefram.net> To: Anton Berezin <tobez@FreeBSD.org> Cc: perl@FreeBSD.org Subject: Re: ports/86687: Perl ithreads coredump Message-ID: <20051001154734.E17540@dante.zefram.net> In-Reply-To: <200509282107.j8SL7oGO005442@freefall.freebsd.org> References: <200509282107.j8SL7oGO005442@freefall.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Here's a sample script that creates the same core dump. It creates 50 threads that look up 1000 hostnames from a database of unique hostnames. They are all unique. It then just runs gethostbyname. The actual script uses IO::Socket::INET... but I didn't want to connect to so many hosts at once.. Without further adieu, here's the script: #!/usr/bin/perl -w use threads; use Socket; $SIG{INT} = \&catch_die; my @threads; my $shutdown :shared = 0; for (1 .. 50) { shift @threads, threads->new(\&thr); } sub thr { my $i = 0; my $dbi = DBI->connect("DBI:mysql:database=spider","xxx","xxx") or die "Unable to connect to MySQL: $!\n"; my $sth = $dbi->prepare("SELECT id, host FROM site LIMIT " . (threads->tid * 1000) . ", 1000"); $sth->execute; return if !$sth->rows; while ($shutdown == 0 && $i < 999) { my @row = $sth->fetchrow(); my $host = $row[1]; my $iaddr = gethostbyname($host) || print "Host $host not found."; $i++; } } while ($shutdown == 0) { sleep(5); } print "Waiting for threads\n"; foreach $thread (@threads) { $thread->join; } sub catch_die { # Shit. Gotta clean our act up. print "Closing once current page has been indexed.\n"; $shutdown = 1; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20051001154734.E17540>