in reply to tracking transient data in memory by countdown timer
This sort of thing is trivial with a thread, a queue and some shared variables:
#! perl -slw use strict; use 5.010; use threads; use threads::shared; use Thread::Queue; sub tprint { my $tid = threads->tid; state $sem :shared; lock $sem; print "$tid: ",@_; } our $PERIOD //= 60; my %db :shared; my $Q = new Thread::Queue; async { while( my( $expiry, $id ) = split ':', $Q->dequeue ) { my $now = time; sleep ( $expiry - $now ) if $now < $expiry; if( $db{ $id } == $expiry ) { lock %db; delete $db{ $id }; tprint "User:$id expired:$expiry; deleted"; } else { tprint "User:$id recently active; reprieved"; } } }->detach; while( sleep 1 ) { my $id = int rand 100; my $expiry = time() + $PERIOD; if( exists $db{ $id } ) { tprint "Existing user:$id active; expiry extended until $expir +y"; } else { tprint "New user:$id added; expiry $expiry"; } lock %db; $db{ $id } = $expiry; $Q->enqueue( "$expiry:$id" ); } __END__ C:\test>889439 -PERIOD=10 0: New user:81 added; expiry 1298316449 0: New user:30 added; expiry 1298316450 0: New user:6 added; expiry 1298316451 0: New user:0 added; expiry 1298316452 0: New user:23 added; expiry 1298316453 0: New user:72 added; expiry 1298316454 0: New user:22 added; expiry 1298316455 0: New user:61 added; expiry 1298316456 0: New user:91 added; expiry 1298316457 0: New user:75 added; expiry 1298316458 1: User:81 expired:1298316449; deleted 0: New user:15 added; expiry 1298316459 1: User:30 expired:1298316450; deleted 0: New user:24 added; expiry 1298316460 1: User:6 expired:1298316451; deleted 0: New user:49 added; expiry 1298316461 1: User:0 expired:1298316452; deleted 0: Existing user:49 active; expiry extended until 1298316462 1: User:23 expired:1298316453; deleted 0: New user:87 added; expiry 1298316463 1: User:72 expired:1298316454; deleted 0: New user:19 added; expiry 1298316464 1: User:22 expired:1298316455; deleted 0: New user:40 added; expiry 1298316465 1: User:61 expired:1298316456; deleted 0: New user:13 added; expiry 1298316466 1: User:91 expired:1298316457; deleted 0: New user:78 added; expiry 1298316467 1: User:75 expired:1298316458; deleted 0: New user:98 added; expiry 1298316468 1: User:15 expired:1298316459; deleted 0: New user:53 added; expiry 1298316469 1: User:24 expired:1298316460; deleted 0: New user:20 added; expiry 1298316470 1: User:49 recently active; reprieved 0: New user:44 added; expiry 1298316471 1: User:49 expired:1298316462; deleted 0: New user:99 added; expiry 1298316472 1: User:87 expired:1298316463; deleted 0: New user:97 added; expiry 1298316473 1: User:19 expired:1298316464; deleted 0: Existing user:20 active; expiry extended until 1298316474 1: User:40 expired:1298316465; deleted 0: New user:24 added; expiry 1298316475 1: User:13 expired:1298316466; deleted 0: New user:70 added; expiry 1298316476 1: User:78 expired:1298316467; deleted 0: New user:87 added; expiry 1298316477 1: User:98 expired:1298316468; deleted 0: New user:42 added; expiry 1298316478 1: User:53 expired:1298316469; deleted 0: New user:79 added; expiry 1298316479 1: User:20 recently active; reprieved 0: New user:56 added; expiry 1298316480 1: User:44 expired:1298316471; deleted 0: New user:48 added; expiry 1298316481 1: User:99 expired:1298316472; deleted 0: Existing user:79 active; expiry extended until 1298316482 1: User:97 expired:1298316473; deleted Terminating on signal SIGINT(2)
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: tracking transient data in memory by countdown timer
by Anonymous Monk on Feb 24, 2011 at 11:58 UTC |