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 | 1x
1x
1x
1x
1x
1x
1x
1x
1x
1000x
1000x
1000x
1000x
1x
1x
1x
1001x
1x
1x
1x
1001x
1x
1x
1x
1x
1000x
1000x
1000x
1000x
1x
1x
1x
1x
1000x
1000x
1000x
1000x
1x
1x
1x
1001x
1x
1x
1x
1001x
1x
1x
1x
1x
1000x
1000x
1000x
1000x
1x
| var slocket = require('../')
var filename = __dirname + '/many-lock-unlock.lock'
var N = 1000
var lockfile = require('lockfile')
var rimraf = require('rimraf')
function parallel (cb) {
rimraf.sync(filename)
var start = Date.now()
var did = 0
for (var i = 0; i < N; i++) {
slocket(filename, function (er) {
Iif (er)
throw er
this.release()
if (++did === N) {
var dur = Date.now() - start
console.log('parallel %d/%dms => %d q/s, %d ms/q', N, dur,
Math.round(N/dur * 1000),
Math.round(dur/N*1000)/1000)
Eif (cb) cb()
}
})
}
}
function serial (cb, i, start) {
if (!i && !start) {
rimraf.sync(filename)
i = i || 0
start = start || Date.now()
}
if (i === N) {
var dur = Date.now() - start
console.log('serial %d/%dms => %d q/s, %d ms/q', N, dur,
Math.round(N/dur * 1000),
Math.round(dur/N * 1000)/1000)
Eif (cb) cb()
return
}
slocket(filename, function (er) {
Iif (er)
throw er
this.release()
serial(cb, i + 1, start)
})
}
function lfp (cb) {
rimraf.sync(filename)
var start = Date.now()
var did = 0
for (var i = 0; i < N; i++) {
lockfile.lock(filename, { retries: Infinity }, function (er) {
Iif (er)
throw er
lockfile.unlock(filename, function () {
if (++did === N) {
var dur = Date.now() - start
console.log('lf parallel %d/%dms => %d q/s, %d ms/q', N, dur,
Math.round(N/dur * 1000),
Math.round(dur/N*1000)/1000)
Eif (cb) cb()
}
})
})
}
}
function lfs (cb, i, start) {
if (!i && !start) {
rimraf.sync(filename)
i = i || 0
start = start || Date.now()
}
if (i === N) {
var dur = Date.now() - start
console.log('lfs %d/%dms => %d q/s, %d ms/q', N, dur,
Math.round(N/dur * 1000),
Math.round(dur/N * 1000)/1000)
Iif (cb) cb()
return
}
lockfile.lock(filename, function (er) {
Iif (er)
throw er
lockfile.unlock(filename, function () {
lfs(cb, i + 1, start)
})
})
}
parallel(() => serial(() => lfp(lfs)))
|