কমপ্লেটেবলফিউচার, ফিউচার এবং আরএক্সজাভা পর্যবেক্ষণযোগ্য মধ্যে পার্থক্য


193

আমি এর মধ্যে পার্থক্য জানতে চাই CompletableFuture, Futureএবং Observable RxJava

আমি যা জানি সবগুলি অ্যাসিনক্রোনাস তবে

Future.get() থ্রেড ব্লক করে

CompletableFuture কলব্যাক পদ্ধতি দেয়

RxJava Observable--- CompletableFutureঅন্যান্য সুবিধার সাথে অনুরূপ (নিশ্চিত নয়)

উদাহরণস্বরূপ: যদি ক্লায়েন্টকে একাধিক পরিষেবা কল করার প্রয়োজন হয় এবং আমরা যখন Futures(জাভা) ব্যবহার করি তখন Future.get()ধারাবাহিকভাবে মৃত্যুদন্ড কার্যকর করা হবে ... আরএক্সজেভাতে এটি আরও কীভাবে আরও ভাল হতে পারে তা জানতে চাই ...

এবং ডকুমেন্টেশন http://reactivex.io/intro.html বলে

শর্তসাপেক্ষ অ্যাসিনক্রোনাস এক্সিকিউশন ফ্লোগুলি (বা অসম্ভব, যেহেতু প্রতিটি অনুরোধের লেটেন্সিগুলি রানটাইমগুলিতে পরিবর্তিত হয়) অনুকূলভাবে রচনা করতে ফিউচারগুলি ব্যবহার করা কঠিন। এটি অবশ্যই করা যেতে পারে তবে এটি দ্রুত জটিল (এবং এইভাবে ত্রুটি-প্রবণ) হয়ে যায় বা এটি অকালক্রমে ফিউচার.জেট () এ ব্লক করে, যা অ্যাসিঙ্ক্রোনাস এক্সিকিউশনের সুবিধাটিকে সরিয়ে দেয়।

RxJavaএই সমস্যাটি কীভাবে সমাধান করে তা জানতে আগ্রহী । ডকুমেন্টেশন থেকে বুঝতে অসুবিধা হয়েছে।


আপনি কি প্রত্যেকটির জন্য ডকুমেন্টেশন পড়েছেন? আমি আরএক্সজাবার সাথে সম্পূর্ণ অপরিচিত, তবে ডকুমেন্টেশন এক নজরে চূড়ান্তভাবে উপস্থিত হয়। এটি দুটি ফিউচারের সাথে বিশেষভাবে তুলনামূলক বলে মনে হয় না।
এফটিম্পসন

আমি পেরেছি কিন্তু জাভা ফিউচারের থেকে এর চেয়ে আলাদা পার্থক্য পেতে সক্ষম হই না ... ভুল হলে আমাকে সংশোধন করুন
shiv455

পর্যবেক্ষণগুলি কীভাবে ভবিষ্যতের সাথে সমান হয়?
এফটিহম্পসন

2
থ্রেড ম্যানেজমেন্টে এটির চেয়ে আলাদা কোথায় তা জানতে চাই ?? EX: Future.get () থ্রেডটি ব্লক করে .... এটি পর্যবেক্ষণে কীভাবে পরিচালনা করা হবে ???
shiv455

2
এটির জন্য আমার জন্য বিট বিহ্বল অন্তত ... একটি উচ্চ স্তরের পার্থক্য সত্যিই সহায়ক হবে !!
shiv455

উত্তর:


278

ফিউচার

ফিউচার জাভা 5 (2004) এ চালু হয়েছিল। এগুলি মূলত কোনও অপারেশনের ফলাফলের জন্য স্থানধারক যা এখনও শেষ হয়নি। অপারেশন শেষ হয়ে গেলে, Futureফলাফলটি এতে থাকবে। উদাহরণস্বরূপ, একটি অপারেশন একটি চালানো বা কলযোগ্য উদাহরণ হতে পারে যা এক্সিকিউটারসেবারে জমা দেওয়া হয় । ক্রিয়াকলাপের জমা দেওয়া সংস্থাটিFuture অপারেশনটি ডোন () হয়েছে কিনা তা যাচাই করতে ব্যবহার করতে বা ব্লকিং গেট () পদ্ধতিটি ব্যবহার করে এটি শেষ হওয়ার জন্য অপেক্ষা করতে পারে ।

উদাহরণ:

/**
* A task that sleeps for a second, then returns 1
**/
public static class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        Thread.sleep(1000);
        return 1;
    }

}

public static void main(String[] args) throws Exception{
    ExecutorService exec = Executors.newSingleThreadExecutor();
    Future<Integer> f = exec.submit(new MyCallable());

    System.out.println(f.isDone()); //False

    System.out.println(f.get()); //Waits until the task is done, then prints 1
}

CompletableFutures

কমপ্লিটেবল ফিউচার জাভা 8 (2014) এ চালু হয়েছিল। এর সপক্ষে তাদের কাছে নিয়মিত ফিউচার, Google এর দ্বারা অনুপ্রাণিত একজন বিবর্তন হয় Listenable ফিউচার , অংশ পেয়ারা গ্রন্থাগার। এগুলি হ'ল ফিউচার যা আপনাকে শৃঙ্খলে এক সাথে কাজগুলি স্ট্রিং করার অনুমতি দেয়। আপনি কিছু কর্মী থ্রেডকে "কিছু টাস্ক এক্স করতে যান, এবং যখন আপনি শেষ করেন, এক্স এর ফলাফল ব্যবহার করে এই অন্য জিনিসটি করতে যান" বলতে তাদের ব্যবহার করতে পারেন। কমপ্লেটেবলফিউচার ব্যবহার করে, ফলাফলটির জন্য অপেক্ষা করার জন্য কোনও থ্রেডকে অবরুদ্ধ না করেই আপনি অপারেশনের ফলাফলের সাথে কিছু করতে পারেন। এখানে একটি সাধারণ উদাহরণ:

/**
* A supplier that sleeps for a second, and then returns one
**/
public static class MySupplier implements Supplier<Integer> {

    @Override
    public Integer get() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            //Do nothing
        }
        return 1;
    }
}

/**
* A (pure) function that adds one to a given Integer
**/
public static class PlusOne implements Function<Integer, Integer> {

    @Override
    public Integer apply(Integer x) {
        return x + 1;
    }
}

public static void main(String[] args) throws Exception {
    ExecutorService exec = Executors.newSingleThreadExecutor();
    CompletableFuture<Integer> f = CompletableFuture.supplyAsync(new MySupplier(), exec);
    System.out.println(f.isDone()); // False
    CompletableFuture<Integer> f2 = f.thenApply(new PlusOne());
    System.out.println(f2.get()); // Waits until the "calculation" is done, then prints 2
}

RxJava

আরএক্সজাভা নেটফ্লিক্সে তৈরি প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের পুরো লাইব্রেরি । এক নজরে, এটি জাভা 8 এর স্ট্রিমগুলির মতো দেখাবে । এটি অনেক বেশি শক্তিশালী ব্যতীত।

একইভাবে ফিউচারগুলিতে, আরএক্সজাভা প্রসেসিং পাইপলাইন তৈরি করতে একগুচ্ছ সিনক্রোনাস বা অ্যাসিনক্রোনাস অ্যাকশনগুলির স্ট্রিংয়ের জন্য ব্যবহার করা যেতে পারে। ফিউচারগুলির থেকে পৃথক, যা একক-ব্যবহারযোগ্য, আরএক্সজাভা শূন্য বা আরও বেশি আইটেমের স্ট্রিমে কাজ করে । অসীম সংখ্যক আইটেম সহ কখনও শেষ না হওয়া স্ট্রিম সহ। অপারেটরগুলির একটি অবিশ্বাস্য সমৃদ্ধ সেটকে এটি আরও অনেক নমনীয় এবং শক্তিশালী ধন্যবাদ ।

জাভা 8 এর স্ট্রিমের বিপরীতে, আরএক্সজাভাতে একটি ব্যাকপ্রেশার মেকানিজমও রয়েছে, এটি আপনার প্রসেসিং পাইপলাইনের বিভিন্ন অংশ বিভিন্ন থ্রেডে বিভিন্ন হারে পরিচালিত কেসগুলি পরিচালনা করতে দেয় ।

আরএক্স জাভা এর নেতিবাচক দিকটি হ'ল দৃ document় দলিল থাকা সত্ত্বেও জড়িত দৃষ্টান্তের পরিবর্তনের কারণে এটি শিখতে চ্যালেঞ্জিং লাইব্রেরি। আরএক্স কোডটি ডিবাগ করার জন্য একটি দুঃস্বপ্ন হতে পারে, বিশেষত যদি একাধিক থ্রেড জড়িত থাকে, এবং আরও খারাপ - যদি ব্যাকপ্রেসার প্রয়োজন হয়।

আপনি যদি এটিতে যেতে চান তবে অফিসিয়াল ওয়েবসাইটে বিভিন্ন টিউটোরিয়ালের পুরো পৃষ্ঠা রয়েছে, সাথে সাথে অফিসিয়াল ডকুমেন্টেশন এবং জাভাদোক । এছাড়াও আপনি যেমন ভিডিওগুলির কয়েকটিতে কটাক্ষপাত করা করতে পারেন এই এক যা Rx মধ্যে একটি সংক্ষিপ্ত ভূমিকা দেয় এবং Rx এবং ফিউচার মধ্যে পার্থক্য নিয়ে কথা বলেছেন।

বোনাস: জাভা 9 প্রতিক্রিয়াশীল স্ট্রিম

জাভা 9 এর প্রতিক্রিয়াশীল স্ট্রিমস ওরফে ফ্লো এপিআই হ'ল আরএক্সজবা 2 , আক্কা স্ট্রিমস এবং ভার্টেক্সের মতো বিভিন্ন প্রতিক্রিয়াশীল স্ট্রিম লাইব্রেরি দ্বারা প্রয়োগ করা ইন্টারফেসগুলির একটি সেট । সমস্ত গুরুত্বপূর্ণ ব্যাক-চাপ সংরক্ষণ করে তারা এই প্রতিক্রিয়াশীল গ্রন্থাগারগুলিকে আন্তঃসংযোগ করার অনুমতি দেয়।



সুতরাং প্রতিক্রিয়াশীল স্ট্রিম ব্যবহার করে, আমরা একটি অ্যাপ্লিকেশনে আরএক্সজাভা, আক্কা এবং ভার্টেক্স মিশ্রিত করতে পারি?
ইগোরগানাপলস্কি

1
@ ইগরগানাপলস্কি হ্যাঁ
মাল্ট

কমপ্লেটেবলফিউচারে আমরা কলব্যাক্স পদ্ধতি ব্যবহার করি, যদি কোনও পদ্ধতির আউটপুট অন্য কলব্যাকের ইনপুট হয় তবে এই কলব্যাক পদ্ধতিগুলিও ব্লক হয়ে যাবে। ফিউচার.জেট () কল সহ ভবিষ্যতের ব্লক। কেন বলা হয় যে ফিউচার.জেট () কল ব্লক করছে যখন কমপ্লেটেবলফিউচার ব্লক করে না। দয়া করে ব্যাখ্যা করুন
দীপক

1
@ ফেডেরিকো শিওর প্রত্যেকেই একক ফলাফলের Futureজন্য স্থানধারক যা এখনও সম্পূর্ণ নাও হতে পারে। আপনি যদি আবার একই অপারেশন করেন তবে আপনি একটি নতুন উদাহরণ পাবেন। আরএক্সজাভা ফলাফলের স্ট্রিমগুলির সাথে কাজ করে যা যে কোনও সময় আসতে পারে। একশ্রেণীর ক্রিয়াকলাপ এমন একক আরএক্সজাভা পর্যবেক্ষণযোগ্য ফিরিয়ে দিতে পারে যা ফলাফলের একটি গোছা ছড়িয়ে দেবে। এটি একক পোস্ট খাম এবং বায়ুসংক্রান্ত নল যা মেইল ​​পাম্প করে চলেছে তার মধ্যে পার্থক্যের মতো কিছুটা। Future
মাল্ট

20

আমি আরএক্স জাভা এর সাথে ০.৯.২০ এর সাথে কাজ করছি, এখন ১.৩.২ এ এবং শিগগিরই ২.x এ স্থানান্তরিত করে আমি এটি একটি বেসরকারী প্রকল্পে ব্যবহার করি যেখানে আমি ইতিমধ্যে ৮ বছর ধরে কাজ করছি।

আমি আর এই লাইব্রেরি ছাড়া প্রোগ্রাম না। শুরুতে আমি সন্দেহবাদী ছিলাম তবে এটি আপনাকে তৈরি করা দরকার এমন একটি সম্পূর্ণ অন্য মনের অবস্থা। প্রথমদিকে শান্ত। আমি মাঝে মাঝে মার্বেলের দিকে ঘণ্টার পর ঘণ্টা তাকিয়ে থাকতাম .. হ্যাঁ

এটি কেবল অনুশীলনের বিষয় এবং প্রবাহটি (পর্যবেক্ষক এবং পর্যবেক্ষকের চুক্তি) হিসাবে জানতে পেরে আপনি একবার সেখানে পৌঁছে গেলে অন্যথায় এটি করতে আপনি ঘৃণা করবেন।

আমার পক্ষে সেই লাইব্রেরিতে আসলেই কোনও খারাপ দিক নেই।

কেস ব্যবহার করুন: আমার কাছে একটি মনিটর ভিউ রয়েছে যা 9 গেজ (সিপিইউ, মেমি, নেটওয়ার্ক, ইত্যাদি ...) ধারণ করে। ভিউ শুরু করার সময়, ভিউটি এমন একটি সিস্টেম মনিটর শ্রেণিতে সাবস্ক্রাইব করে যা একটি পর্যবেক্ষণযোগ্য (ব্যবধান) ফেরত দেয় যা 9 মিটারের সমস্ত ডেটা ধারণ করে। এটি প্রতিটি সেকেন্ডে ভিউতে একটি নতুন ফলাফলকে ঠেলে দেবে (সুতরাং ভোটদান নয় !!!)। এই পর্যবেক্ষণযোগ্য এক সাথে 9 টি উত্স থেকে ডেটা আনার জন্য ফ্ল্যাটম্যাপ ব্যবহার করে (অ্যাসিঙ্ক!) এবং ফলাফলটি একটি নতুন মডেলটিতে জিপ করে আপনার ভিউটি অনেক্সট () এ পাবেন।

ভবিষ্যত, পরিপূরণ ইত্যাদির সাহায্যে তুমি কী করবে! শুভকামনা! :)

আরএক্স জাভা আমার জন্য প্রোগ্রামিংয়ের অনেকগুলি সমস্যার সমাধান করে এবং একভাবে অনেক সহজ করে তোলে ...

সুবিধাদি:

  • স্টেটলাস !!! (উল্লেখ করার জন্য গুরুত্বপূর্ণ বিষয়, সম্ভবত সবচেয়ে গুরুত্বপূর্ণ)
  • বাক্সের বাইরে থ্রেড ম্যানেজমেন্ট
  • সিকোয়েন্সগুলি তৈরি করুন যার নিজস্ব জীবনচক্র রয়েছে
  • সমস্ত কিছু পর্যবেক্ষণযোগ্য তাই চেইন করা সহজ
  • লেখার জন্য কম কোড
  • ক্লাসপথে একক জার (খুব লাইটওয়েট)
  • অত্যন্ত সমকালীন
  • আর কলব্যাক নরক নেই
  • গ্রাহক ভিত্তিক (ভোক্তা এবং উত্পাদকের মধ্যে শক্ত চুক্তি)
  • ব্যাকপ্রেসার কৌশল (সার্কিট ব্রেকার এক মত)
  • হ্যান্ডলিং এবং পুনরুদ্ধার করার জন্য দুর্দান্ত ত্রুটি
  • খুব সুন্দর ডকুমেন্টেশন (মার্বেল <3)
  • সম্পূর্ণ নিয়ন্ত্রণ
  • আরো অনেক ...

অসুবিধা: - পরীক্ষা করা শক্ত


13
? " আমি আর এই লাইব্রেরি ছাড়া আর কোনও প্রোগ্রাম করতাম না। " সুতরাং আরএক্সজেবা কি সব সফ্টওয়্যার প্রকল্পের সব শেষ?
ইগোরগানাপলস্কি

অ্যাসিক্রোনাস ইভেন্টের স্ট্রিম না থাকলেও কী এটি কার্যকর?
মুকেশ ভার্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.