Schrift
[thread]6774[/thread]

Lock zwischen n Prozessen

Leser: 1


<< >> 7 Einträge, 1 Seite
esskar
 2005-03-09 22:26
#52483 #52483
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Ich muss gewährleitsten, dass 1 Prozess eine Aktion ausführt ohne das ein 2ter Prozess die selben Prozess ausführen kann.
Hab mir dann überlegt, in ein Verzeichnis eine Datei zu erzeugen und einen flock drauf zu legen; könnt ja mal drüber schauen und schauen, ob ich was vergessen hab.

Code: (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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use strict;
use warnings;

package Ox::Lock;
use vars '$VERSION';
$VERSION = '0.05';


use Fcntl ':flock';

sub new {
my $proto = shift;

return undef
unless defined $proto;

my $class = ref($proto) || $proto;
my $self = bless {}, $class;

$self->init(@_) if @_;
$self->directory('/') unless defined $self->directory;

return ($self);
}

sub DESTROY {
shift->unlock;
}

sub directory {
my $self = shift;
return ($self->value_('directory', @_));
}

sub handle {
my $self = shift;
return $self->directory().".lock";
}

sub load {
my $self = shift;

$self->unload();

unless(-e $self->handle) {
my $fh;
if(open my $fh, ">", $self->handle) {
$self->{-lock} = $fh;
return (1);
}
}

return (0);
}

sub unload {
my $self = shift;
if(defined $self->{-lock}) {
close $self->{-lock};
unlink $self->handle;
$self->{-lock} = undef;
}
}

sub lock {
my $self = shift;

if($self->load) {
return (flock $self->{-lock}, LOCK_EX);
} else {
return (0);
}
}

sub trylock {
my $self = shift;

if($self->load) {
return (flock $self->{-lock}, LOCK_EX | LOCK_NB);
} else {
return (0);
}
}

sub unlock {
shift->unload;
}

sub init(\%) {
my ($self, %args) = @_;

exists $args{$_} && ($self->value_($_, delete $args{$_}))
foreach (qw/directory/);
}

sub value_ {
my ($self, $field, $value) = @_;

return (undef)
unless defined $field;

if(defined $value) {
$self->{'OWML_'.lc($field)} = $value;
}

return ($self->{'OWML_'.lc($field)});
}

1;


[edit]pq's Verschönerungen eingebaut[/edit]\n\n

<!--EDIT|esskar|1110418277-->
pq
 2005-03-09 23:26
#52484 #52484
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
sieht doch gut aus. das unlock im DESTROY ist aber überflüssig.
der lock fällt ja in dem moment weg, in dem das handle weg ist.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2005-03-09 23:29
#52485 #52485
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
my $fh;
if(open($fh, ">".$self->handle())) {

==>
if(open my $fh, ">", $self->handle) {

wir schreiben ja schließlich perl =)\n\n

<!--EDIT|pq|1110403841-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
esskar
 2005-03-09 23:41
#52486 #52486
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=pq,09.03.2005, 22:29]wir schreiben ja schließlich perl =)[/quote]
ach ja, ich vergaß :)
esskar
 2005-03-09 23:42
#52487 #52487
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=pq,09.03.2005, 22:26]der lock fällt ja in dem moment weg, in dem das handle weg ist.[/quote]
schon; aber die datei soll auch gelöscht werden!
renee
 2005-03-09 23:45
#52488 #52488
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
warum rufst Du unlock() auf, wenn dort sowieso nur unload() aufgerufen wird??

Da kannst Du doch gleich unload() aufrufen...
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/
esskar
 2005-03-10 00:02
#52489 #52489
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=renee,09.03.2005, 22:45]warum rufst Du unlock() auf, wenn dort sowieso nur unload() aufgerufen wird??

Da kannst Du doch gleich unload() aufrufen...[/quote]
ich hab mir angewöhnt, immer die höchte Funktion aufzurufen, die die Sache erfüllt. Beispiel

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub set {
my ($self, $value, $field) = @_;
$self->{$value} = $field;
}

sub update {
my ($self) = @_;

$self->set('feld1', 'wert1');
$self->set('feld2', 'wert2');
$self->set('feld3', 'wert3');
}


genauso gut hätt ich in update auch $self->{feld1} = 'wert1' schreiben können; aber da ich es so kapsel, kann ich später set ändern und alles bleibt in butter
genauso kann es sein, dass unlock irgendwann mal mehr macht als unload aufzurufen; ist einfach ne design frage!
<< >> 7 Einträge, 1 Seite



View all threads created 2005-03-09 22:26.