Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Radek Hušek
group-connectivity-pub
Commits
abcebb96
Commit
abcebb96
authored
Dec 10, 2015
by
Radek Hušek
Committed by
Radek Hušek
Nov 09, 2017
Browse files
parmap: decouple producer into separate thread
parent
f20caa71
Changes
1
Hide whitespace changes
Inline
Side-by-side
parmap.py
View file @
abcebb96
...
...
@@ -3,9 +3,20 @@
import
multiprocessing
def
fun
(
f
,
q_in
,
q_out
):
def
producer_fun
(
X
,
q_in
,
q_control
,
nprocs
):
sent
=
0
for
i
,
x
in
enumerate
(
X
):
q_in
.
put
((
i
,
x
))
sent
+=
1
for
_
in
range
(
nprocs
):
q_in
.
put
((
None
,
None
))
q_control
.
put
((
None
,
sent
))
def
worker_fun
(
f
,
q_in
,
q_out
):
while
True
:
i
,
x
=
q_in
.
get
()
i
,
x
=
q_in
.
get
()
if
i
is
None
:
break
q_out
.
put
((
i
,
f
(
x
)))
...
...
@@ -17,20 +28,34 @@ def parmap(f, X, nprocs = None):
q_in
=
multiprocessing
.
Queue
(
100
)
q_out
=
multiprocessing
.
Queue
()
proc
=
[
multiprocessing
.
Process
(
target
=
fun
,
args
=
(
f
,
q_in
,
q_out
))
for
_
in
range
(
nprocs
)]
proc
=
[
multiprocessing
.
Process
(
target
=
worker_fun
,
args
=
(
f
,
q_in
,
q_out
)
)
for
_
in
range
(
nprocs
)]
proc
.
append
(
multiprocessing
.
Process
(
target
=
producer_fun
,
args
=
(
X
,
q_in
,
q_out
,
nprocs
)
))
for
p
in
proc
:
p
.
daemon
=
True
p
.
start
()
sent
=
[
q_in
.
put
((
i
,
x
))
for
i
,
x
in
enumerate
(
X
)]
[
q_in
.
put
((
None
,
None
))
for
_
in
range
(
nprocs
)]
ret
=
{}
for
_
in
range
(
len
(
sent
)):
jobs
=
None
while
True
:
i
,
val
=
q_out
.
get
()
if
i
is
None
:
jobs
=
val
break
ret
[
i
]
=
val
[
p
.
join
()
for
p
in
proc
]
for
_
in
range
(
jobs
-
len
(
ret
)):
i
,
val
=
q_out
.
get
()
ret
[
i
]
=
val
for
p
in
proc
:
p
.
join
()
return
[
ret
[
i
]
for
i
in
range
(
len
(
sen
t
))
]
return
[
ret
[
i
]
for
i
in
range
(
len
(
re
t
))
]
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment