Hi, Are there any Cache::* modules that are thread safe and can be used with Threading?
Using Cache::Memory (even specifying the same NameSpace), two or more threads can't access the same keys in the cache, Using Cache::File, there are issues with the indexes (documented too under Caveats, Neither can be :shared, Invalid value for shared scalar I'm basically just looking for a key->value type of way to share data between the threads, but I would prefer not to use an external resource such as memcached or redis. Master thread basically uses Thread::Queues to enqueue work received via an IO::Socket::INET, slaves process the work (while the client socket waits), and then the master thread returns the result from the queued work back over the TCP socket. With IO::Select and IO::Sockets, this is the rundown of the client loop... while (1) { foreach my $ClientConnection ($Select->can_read(1)) { if ($ClientConnection == $ServerSocket) { $ClientConnection = $ServerSocket->accept(); $Select->add($ClientConnection); } else { my $Data = $ClientConnection->getline(); unless (defined($Data) && length($Data)) { $Select->remove($ClientConnection); $ClientConnection->shutdown(2); close $ClientConnection; next; } if ($RequestQueue->pending() > $MaxConnections*4) { $ClientConnection->send("400 Too busy\r\n"); next; } else { $Data =~ s/[^ -~]//g; $RequestQueue->enqueue($Data); my $Processed = 0; my $TimeStamp = time(); if (defined($Data) && length($Data)) { do { # $Cache->set is called in the worker threads my $Response = $Cache->get($Data); if ($Response && $Response ne "") { $ClientConnection->send($Response); $Cache->remove($Data); $Processed=1; } } until ($Processed==1 || time() - $TimeStamp >= 2); } } } } } -- Regards, Chris Knipe