अध्याय प्रोग्रामिंग Erlang पुस्तक के "प्रोग्रामिंग मल्टीकोर CPUs" में, जो आर्मस्ट्रांग एक नक्शे के समारोह के साथ में चलाना का एक अच्छा उदाहरण देता है:Erlang में हजारों संदेशों के लिए प्राप्त पाश को कैसे अनुकूलित करें?
pmap(F, L) ->
S = self(),
%% make_ref() returns a unique reference
%% we'll match on this later
Ref = erlang:make_ref(),
Pids = map(fun(I) ->
spawn(fun() -> do_f(S, Ref, F, I) end)
end, L),
%% gather the results
gather(Pids, Ref).
do_f(Parent, Ref, F, I) ->
Parent ! {self(), Ref, (catch F(I))}.
gather([Pid|T], Ref) ->
receive
{Pid, Ref, Ret} -> [Ret|gather(T, Ref)]
end;
gather([], _) ->
[].
यह अच्छी तरह से काम करता है, लेकिन मेरा मानना है कि के कारण इसमें एक अड़चन है यह 100,000+ तत्वों के साथ सूचियों पर वास्तव में धीमी गति से काम करने के लिए काम करता है।
जब gather()
फ़ंक्शन निष्पादित किया जाता है, तो यह मुख्य प्रक्रिया मेलबॉक्स में किसी संदेश के साथ Pids
सूची से पहले Pid
से मेल खाता है। लेकिन क्या होगा यदि मेलबॉक्स में सबसे पुराना संदेश इस Pid
से नहीं है? फिर यह अन्य सभी संदेशों को तब तक कोशिश करता है जब तक कि यह एक मैच न मिल जाए। ऐसा कहा जा रहा है कि, एक निश्चित संभावना है कि gather()
फ़ंक्शन निष्पादित करते समय हमें के साथ एक मिलान खोजने के लिए सभी मेलबॉक्स संदेशों के माध्यम से लूप करना होगा जिसे हमने Pids
सूची से लिया है।
gather([Pid|T], Ref) ->
receive
{Pid, Ref, Ret} -> [Ret|gather(T, Ref)];
%% Here it is:
Other -> io:format("The oldest message in the mailbox (~w) did not match with Pid ~w~n", [Other,Pid])
end;
मैं इस टोंटी से बच सकते हैं: यह आकार एन की एक सूची
मैं भी इस टोंटी के अस्तित्व को साबित करने में कामयाब रहे है एन * एन सबसे खराब स्थिति है?
एक बहुत ही साधारण समस्या की तरह लगता है, हैरान है कि इसके लिए अभी भी कोई अच्छा जवाब नहीं है। – cnst