ক্লোজার "বারবার" ক্রমান্বয়ে "ভবিষ্যত" চালায়


12

এই স্নিপেট যখন

(dorun 
  (map deref 
    (map #(future 
            (println % (Thread/currentThread))) 
         (range 10))))

বিভিন্ন থ্রেড দেখাচ্ছে 10 আন্তঃব্যক্ত রেখা মুদ্রণ:

0 #object[java.lang.Thread 0x5f1b4a83 Thread[clojure-agent-send-off-pool-26,5,main]]                                                                                                                           
2 #object[java.lang.Thread 1 0x79dfba1f #object[Thread[clojure-agent-send-off-pool-28,5,main]java.lang.Thread]                                                                                                 
3 4 #object[java.lang.Thread #object[java.lang.Thread 0x7ef7224f Thread[clojure-agent-send-off-pool-27,5,main]0x5f1b4a83 ]Thread[clojure-agent-send-off-pool-26,5,main]]                                       
5                                                                                                                                                                                                              
67  #object[java.lang.Thread #object[0x79dfba1f java.lang.Thread Thread[clojure-agent-send-off-pool-28,5,main]]0x77526645                                                                                      
 8 #object[java.lang.Thread #object[java.lang.ThreadThread[clojure-agent-send-off-pool-29,5,main] ]9 #object[java.lang.Thread 0xc143aa5 0x7ef7224f                                                             Thread[clojure-agent-send-off-pool-31,5,main]]Thread[clojure-agent-send-off-pool-27,5,main]]                                                                                                                       

0x1ce8675f 0x379ae862 Thread[clojure-agent-send-off-pool-30,5,main]Thread[clojure-agent-send-off-pool-32,5,main]]]

আমি যেমনটি আশা করব, নিম্নলিখিত স্নিপেট:

(dorun
  (map deref 
    (map #(future 
            (println % (Thread/currentThread))) 
         (repeatedly 10 #(identity 42)))))

একই থ্রেডের সাথে 10 টি সুস্পষ্টভাবে সারিবদ্ধ স্ট্রিং উত্পাদন করে:

42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                                                                                                                              
42 #object[java.lang.Thread 0x1e1b7ffb Thread[clojure-agent-send-off-pool-39,5,main]]                          

যা স্পষ্টভাবে ইঙ্গিত দেয় যে ফিউচারগুলি সমান্তরালভাবে চালিত হয় না, তবে প্রতিটি একই থ্রেডে থাকে।

এটি কেবল তখনই ঘটে repeatedly, যদি আমি doallপ্রথমটির সাথে ক্রমটি উপলব্ধি করি তবে ভেক্টর, rangeগুলি বা অন্যান্য সিকোয়েন্সগুলি সমস্ত ফলাফল সমান্তরাল কার্যকর হয়।

ভবিষ্যতে কেন repeatedlyব্যবহৃত হয় যখন একই থ্রেডে প্রেরণ করা হয়?

ধন্যবাদ!

উত্তর:


13

এইটা কাজ করে:

(dorun (map deref (doall (map #(future (println % (Thread/currentThread))) (repeatedly 10 #(identity 42))))))

সমস্যা হল rangeএকটি উত্পাদন করে chunked ক্রম যখন repeatedlyএকটি উত্পাদন করে unchunked অনুক্রম। মানচিত্রটি অলস, সুতরাং আপনি repeatedlyযদি ভবিষ্যত তৈরি করছেন, তবে এটির অবমূল্যায়ন করুন, তারপরে পরবর্তী ভবিষ্যত তৈরি করুন, তারপরে এটিকে অবনমিত করুন। ইন rangeকেস ক্রম chunked তাই আপনি সব ফিউচার তৈরি করছেন এবং তারপর derefতাদের সব ing।

খণ্ডিত এবং অযথাযুক্ত ক্রমগুলির আচরণের মধ্যে পার্থক্যটি পর্যবেক্ষণ করার জন্য আরও একটি মজাদার উপায়।

=> (first (map prn (range 10)))
0
1
2
3
4
5
6
7
8
9
nil
=> (first (map prn (repeatedly 10 #(identity 13))))
13
nil

খণ্ডগুলির আকার সাধারণত 32 (তবে আমি মনে করি এটি কোথাও গ্যারান্টিযুক্ত নয়), আপনি চালিত হলে দেখা যাবে (first (map prn (range 1000)))

ক্লোজুরের সেই লুকানো বৈশিষ্ট্যগুলির মধ্যে চুনকিং হ'ল এটি যখন আপনাকে প্রথমে কামড় দেয় তখন আপনি সাধারণত শিখেন :)


1
ওহো! [ষড়যন্ত্র Keোকান কীনু মেমহিরে পৌঁছেছে]: আমি এই আসতে দেখিনি! মহান উত্তরের জন্য আপনাকে ধন্যবাদ!
রিক 77

1
সমস্যা নেই! আমি কেবল এই প্রশ্নটি দেখেছি কারণ আপনি এটি ফ্রিনোডে # ক্লোজারে পোস্ট করেছেন।
opqdonut
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.