मेरे पर्ल स्क्रिप्ट एक साथ कई धागे को चलाने के लिए की जरूरत है ...पर्ल में सेमफोर थ्रेड संचार को कैसे कार्यान्वित करें?
use threads ('yield', 'exit' => 'threads_only');
use threads::shared;
use strict;
use warnings;
no warnings 'threads';
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Async;
use ...
... और इस तरह के धागे वेब से कुछ जानकारी प्राप्त करने की आवश्यकता है, तो HTTP::Async
प्रयोग किया जाता है।
my $request = HTTP::Request->new;
$request->protocol('HTTP/1.1');
$request->method('GET');
$request->header('User-Agent' => '...');
my $async = HTTP::Async->new(slots => 100,
timeout => REQUEST_TIMEOUT,
max_request_time => REQUEST_TIMEOUT);
लेकिन कुछ धागे वेब तक पहुँचने के लिए केवल जब अन्य धागा (रों) तो कहते हैं की जरूरत है।
my $start = [Time::HiRes::gettimeofday()];
my @threads =();
foreach ... {
$thread = threads->create(
sub {
local $SIG{KILL} = sub { threads->exit };
my $url = shift;
if ($url ...) {
# wait for "go" signal from other threads
}
my ($response, $data);
$request->url($url);
$data = '';
$async->add($request);
while ($response = $async->wait_for_next_response) {
threads->yield();
$data .= $response->as_string;
}
if ($data ...) {
# send "go" signal to waiting threads
}
}
}, $_);
if (defined $thread) {
$thread->detach;
push (@threads, $thread);
}
}
"go" संकेत के लिए इंतजार कर एक या अधिक धागे हो सकती है और वहाँ एक या अधिक धागे कि इस तरह के "go" संकेत भेज सकते हैं हो सकता है। शुरुआत में सेमफोर की स्थिति " प्रतीक्षा करें" और एक बार यह " पर जाएं", यह ऐसा ही रहेगा।
अंत में, ऐप अधिकतम चलने का समय जांचता है। यदि धागे बहुत लंबे समय तक चल रहे हैं, तो आत्म-समाप्ति संकेत भेजा जाता है।
my $running;
do {
$running = 0;
foreach my $thread (@threads) {
$running++ if $thread->is_running();
}
threads->yield();
} until (($running == 0) ||
(Time::HiRes::tv_interval($start) > MAX_RUN_TIME));
$running = 0;
foreach my $thread (@threads) {
if ($thread->is_running()) {
$thread->kill('KILL');
$running++;
}
}
threads->yield();
अब बात करने के लिए। मेरे प्रश्न हैं:
कैसे कर सकता है मैं सबसे अधिक प्रभावी ढंग कोड "सेमाफोर" इंतज़ार कर लिपि में (ऊपर स्क्रिप्ट में टिप्पणी देखें)। क्या मुझे बस कुछ डमी
sleep
लूप के साथ साझा साझा चर का उपयोग करना चाहिए?मैं अनुप्रयोग के अंत में कुछ
sleep
पाश जोड़ने के लिए विनाश के लिए धागे को समय देने की जरूरत है?
मैं सही ढंग से समझते हैं कि आप अलग HTTP :: Async वस्तुओं (कॉपी, नहीं, नए सूत्र द्वारा साझा) लाने के लिए ज़्यादा से ज़्यादा एक यूआरएल का उपयोग कर रहे करें प्रति थ्रेड पर एक समय में? – pilcrow
@pilcrow - हाँ, ऐसा लगता है। क्या यह संसाधनों का अपशिष्ट है? –
यह कम स्मृति या समय-कुशल नहीं हो सकता है, लेकिन यह वास्तविक नाली प्रोग्रामर चक्रों पर है। :) डिजाइन को समझना मुश्किल है, और शायद सुरक्षित रूप से बदलने/विस्तार करने के लिए, क्योंकि घटक काफी सही नहीं लगते हैं। – pilcrow