A common question about RxJava is how to achieve parallelization, or emitting multiple items concurrently from an Observable. Of course, this definition breaks the Observable Contract which states that onNext() must be called sequentially and never concurrently by more than one thread at a time. Now you may be thinking "how the heck am I supposed to achieve parallelization then, which by definition is multiple items getting processed at a time!?" Widespread misunderstanding of how parallel actually works in RxJava has even led to the discontinuation of the parallel operator.
You can achieve parallelization in RxJava without breaking the Observable contract, but it requires a little understanding of Schedulers and how operators deal with multiple asynchronous sources.
Say you have this simple Observable that emits a range of Integers 1 to 10 upon subscription.
Observable<Integer> vals = Observable.range(1,10); vals.subscribe(val -> System.out.println(val);)
But let's say we are doing some very intense calculation process to each Integer value.
Observable<Integer> vals = Observable.range(1,10); vals.map(i -> intenseCalculation(i)) .subscribe(val -> System.out.println(val);)
And for simplicity's sake let's just make intenseCalculation() sleep for a random interval before returning the integer back, simulating an intensive calculation. We will also make it print the current thread the computation is occurring on.
public static int intenseCalculation(int i) { try { System.out.println("Calculating " + i + " on " + Thread.currentThread().getName()); Thread.sleep(randInt(1000,5000)); return i; } catch (InterruptedException e) { throw new RuntimeException(e); } }
We would want to parallelize and process multiple integers at a time. A common mistake people make is think "Oh, I just use subscribeOn() and have the source Observable emit items on multiple computation threads just like an ExecutorService.
Observable<Integer> vals = Observable.range(1,10); vals.subscribeOn(Schedulers.computation()) .map(i -> intenseCalculation(i)) .subscribe(val -> System.out.println("Subscriber received " + val + " on " + Thread.currentThread().getName()));
However, if you run this code you will get this output, showing that each integer only emitted on one computation thread, not several as you might have expected. As a matter of fact, this is as sequential as a single-threaded operation.
Calculating 1 on RxComputationThreadPool-1 Subscriber received 1 on RxComputationThreadPool-1 Calculating 2 on RxComputationThreadPool-1 Subscriber received 2 on RxComputationThreadPool-1 Calculating 3 on RxComputationThreadPool-1 Subscriber received 3 on RxComputationThreadPool-1 Calculating 4 on RxComputationThreadPool-1 Subscriber received 4 on RxComputationThreadPool-1 Calculating 5 on RxComputationThreadPool-1 Subscriber received 5 on RxComputationThreadPool-1 Calculating 6 on RxComputationThreadPool-1 Subscriber received 6 on RxComputationThreadPool-1 Calculating 7 on RxComputationThreadPool-1 Subscriber received 7 on RxComputationThreadPool-1 Calculating 8 on RxComputationThreadPool-1 Subscriber received 8 on RxComputationThreadPool-1 Calculating 9 on RxComputationThreadPool-1 Subscriber received 9 on RxComputationThreadPool-1alculating 10 on RxComputationThreadPool-1 Subscriber received 10 on RxComputationThreadPool-1
Well that was not helpful! We did not achieve any effective parallelization at all. We just directed the emissions to happen on another thread named RxComputationThreadPool-1.
So how do we make calculations happen on more than one computation thread? And do it without breaking the Observable contract? The secret is to catch each Integer in a flatMap(), create an Observable off it, do a subscribeOn() to the computation scheduler, and then perform the process all within the flatMap().
Observable<Integer> vals = Observable.range(1,10); vals.flatMap(val -> Observable.just(val) .subscribeOn(Schedulers.computation()) .map(i -> intenseCalculation(i)) ).subscribe(val -> System.out.println(val));Now we are getting somewhere and this looks pretty parallel now. We are getting multiple emissions happening on different computational threads.
Calculating 1 on RxComputationThreadPool-3 Calculating 4 on RxComputationThreadPool-2 Calculating 3 on RxComputationThreadPool-1 Calculating 2 on RxComputationThreadPool-4 Subscriber received 3 on RxComputationThreadPool-1 Calculating 7 on RxComputationThreadPool-1 Subscriber received 4 on RxComputationThreadPool-2 Calculating 8 on RxComputationThreadPool-2 Subscriber received 2 on RxComputationThreadPool-4 Calculating 6 on RxComputationThreadPool-4 Subscriber received 8 on RxComputationThreadPool-2 Subscriber received 6 on RxComputationThreadPool-4 Calculating 10 on RxComputationThreadPool-4 Subscriber received 7 on RxComputationThreadPool-1 Subscriber received 10 on RxComputationThreadPool-4 Subscriber received 1 on RxComputationThreadPool-3 Calculating 5 on RxComputationThreadPool-3 Subscriber received 5 on RxComputationThreadPool-3 Calculating 9 on RxComputationThreadPool-3 Subscriber received 9 on RxComputationThreadPool-3
RX COMPUTATION THREAD ---------------------------1---- RX COMPUTATION THREAD -------------------------3------ RX COMPUTATION THREAD -----------------------------2-- RX COMPUTATION THREAD ---------------------------4---- MAIN THREAD ------7---6--5------------------But how is this not breaking the Observable contract you ask? Remember that you cannot have concurrent onNext() calls on the same Observable. We have created an independent Observable off each integer value and scheduled them on separate computational threads, making their concurrency legitimate.
Now you may also be asking "Well... why is the Subscriber receiving emissions from multiple threads then? That sounds an awful lot like concurrent onNext() calls are happening and that breaks the contract."
Actually, there are no concurrent onNext() calls happening. The flatMap() has to merge emissions from multiple Observables happening on multiple threads, but it cannot allow concurrent onNext() calls to happen down the chain including the Subscriber. It will not block and synchronize either because that would undermine the benefits of RxJava. Instead of blocking, it will re-use the thread currently emitting something out of the flatMap(). If other threads want to emit items while another thread is emitting out the flatMap(), the other threads will leave their emissions for the occupying thread to take ownership of.
Here is proof as the above example makes this not so obvious. Let's collect the emissions into a toList() before they go to the Subscriber.
Observable<Integer>vals = Observable.range(1,10); vals.flatMap(val -> Observable.just(val) .subscribeOn(Schedulers.computation()) .map(i -> intenseCalculation(i)) ).toList() .subscribe(val -> System.out.println("Subscriber received " + val + " on " + Thread.currentThread().getName()));
Observe the output below.
Calculating 4 on RxComputationThreadPool-2 Calculating 1 on RxComputationThreadPool-3 Calculating 2 on RxComputationThreadPool-4 Calculating 3 on RxComputationThreadPool-1 Calculating 7 on RxComputationThreadPool-1 Calculating 6 on RxComputationThreadPool-4 Calculating 5 on RxComputationThreadPool-3 Calculating 10 on RxComputationThreadPool-4 Calculating 8 on RxComputationThreadPool-2 Calculating 9 on RxComputationThreadPool-3 Subscriber received [3, 2, 1, 6, 4, 7, 10, 5, 8, 9] on RxComputationThreadPool-3
Notice that the calculations were all happening on different threads, and the flatMap() was pushing items out on one of these threads at a given time. But the last thread to do an emission was RxComputationThreadPool-3. This happened to be the thread pushing items out of flatMap() when it needed to emit the final value 9, so it called onCompleted() which pushed out the list all the way to the Subscriber.
Let me know if you have any questions. Here is the full working example.
import rx.Observable; import rx.schedulers.Schedulers; import java.util.Random; public final class ParallelTest { private static final Random rand = new Random(); public static void main(String[] args) { Observable<Integer>vals = Observable.range(1,10); vals.flatMap(val -> Observable.just(val) .subscribeOn(Schedulers.computation()) .map(i -> intenseCalculation(i)) ).subscribe(val -> System.out.println("Subscriber received " + val + " on " + Thread.currentThread().getName())); waitSleep(); } public static void waitSleep() { try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } } public static int intenseCalculation(int i) { try { System.out.println("Calculating " + i + " on " + Thread.currentThread().getName()); Thread.sleep(randInt(1000,5000)); return i; } catch (InterruptedException e) { throw new RuntimeException(e); } } public static int randInt(int min, int max) { return rand.nextInt((max - min) + 1) + min; } }
About Fixing Thread Pools
Please note as David mentioned below that this parallelization strategy does not work with all Schedulers. Some Schedulers other than computation() could flood the system with too many threads and therefore cause poor performance. The computation scheduler limits the number of concurrent processes that can happen inside the flatMap() based on the number of CPU's your machine has. If you wanted to use other schedulers like newThread() and io() which do not limit the number of threads, you can pass a second int argument to the flatMap() limiting the number of concurrent processes.
You can also create a Scheduler off an ExecutorService giving you more fine-tuned control if needed. Actually you can get significantly better performance doing this. You can read about it in my other article on Maximizing Parallelization.
Great post!
ReplyDeleteI just wanted to add that this approach doesn't work with any Scheduler; this works with computation() and any fixed-size Executor turned into a Scheduler. io() and newThread() will flood the system with threads. However, if you use the flatMap(func, maxConcurrency) overload, you can limit the active number of threads (although newThread will still churn through many of them).
In addition, you can use groupBy with a round-robin key selector:
AtomicInteger key = new AtomicInteger()
source.groupBy(v -> key.getAndIncrement() % 5)
.flatMap(g -> g.observeOn(scheduler).map(i -> calculation(i)))
.subscribe(...);
This will avoid creating too many one-time Observables and Workers.
How does this work with computation without the max concurrency overload?
DeleteFrom my observations as well as general understanding of concurrency, it limits the number of available threads to an appropriate number based on the number of cores you have. Please correct me if I'm wrong David...
DeleteIf you have 8 cores, this will only use 5 of them. If you have 4 cores, two groups will share the same core.
DeleteI finally get the round-robin key-selector now. Very clever.
DeleteWhile it certainly can accomplish the goal, it's still not as good as just piping tasks into an ExecutorService in terms of efficiency, especially if you're dealing with large sets of data and/or large variations in latency in the calculation() method. From what I can tell, https://github.com/ReactiveX/RxJava/wiki/Parallel-flows is the new/"right" way to do non-sequential parallelization of the pipeline, in RxJava 2. Is that right? Has anyone tried it?
DeleteThe solution with groupBy and observeOn proposed by David does not seem to support backpressure. It will request all data from the source at once.
DeleteIt has been fixed recently ;).
DeleteGreat Article
DeleteIEEE final year projects on machine learning
JavaScript Training in Chennai
Final Year Project Centers in Chennai
JavaScript Training in Chennai
Thanks David! I'll make a mention of that regarding Schedulers and fixed sizing a little later when I edit this. I need to update one of the visualizations anyway, realizing I misrepresented the subscribeOn() as an observeOn() switching from one thread to another.
ReplyDeleteI have never seen that groupBy() approach so I'll need to play with it. I've been interested to see if anything would come out of the RxJava Parallel project on GitHub, but noticed it had no activity for awhile. I was wondering if new operators in that project would challenge the Observable contract safely.
It is hard to compete with Java 8 Stream's parallel mode. I have a bunch of ideas for RxJavaParallel but not the time for it.
ReplyDeletehaha yeah, prioritizing is always the frustrating part of being a developer. Stream's parallel operator is pull-based of course which I'm guessing is simpler to achieve. But what makes Rx so great in my opinion is its composability allows it to scale any problem, even its own perceived limitations.
DeleteExcellent post, thanks!
ReplyDeleteGreat post!
ReplyDeleteI thought RxJava guarantees the order of items in Subscriber is the same as in Observer. Do you have idea how to achieve this and still keep the parallelization? How would you extend you example? Thanks
An Observable will emit items in a sequential, deterministic order. But when multiple sources are parallelized and merged, order can logically no longer be enforced. You will want to avoid parallelization if order matters.
DeleteThanks.. I wrote the same without using lamda. I am getting different results
ReplyDeleteWHats wrong with my code
vals.flatMap(new Func1>() {
@Override
public Observable call(Integer pArg0) {
// TODO Auto-generated method stub
return Observable.just(pArg0);
}
}).subscribeOn(Schedulers.computation()).map(new Func1() {
@Override
public Integer call(Integer pArg0) {
// TODO Auto-generated method stub
return intenseCalculation(pArg0);
}
}).subscribe(new Action1() {
@Override
public void call(Integer pArg0) {
System.out.println(" Subscribed recieved " + pArg0 + " on " + Thread.currentThread().getName());
}
});
Hi Arun! Your lambda-less code, though compilable, seems not to be equivalent to the source example in the post. Try the following:
Deletevals.flatMap(new Func1>() {
@Override
public Observable call(Integer pArg0) {
// TODO Auto-generated method stub
return Observable.just(pArg0).
subscribeOn(Schedulers.computation())
.map(new Func1() {
@Override
public Integer call(Integer pArg0) {
// TODO Auto-generated method stub
return intenseCalculation(pArg0);
}
});
}
}).subscribe(new Action1() {
@Override
public void call(Integer pArg0) {
System.out.println(" Subscribed recieved " + pArg0 + " on " + Thread.currentThread().getName());
}
});
Great article on Parallelization. In the full working example, I noticed ".toList()" missing. Was that intentional? Thanks!
ReplyDeleteFrom your code, if I add a thread.sleep in the subscribe i.e
ReplyDeleteFlowable.range(1,1000)
.flatMap(val -> Flowable.just(val)
.subscribeOn(Schedulers.computation())
.map(i -> intenseCalculation(i))
).subscribe(val -> {
Thread.sleep(500);
System.out.println("Subscriber received "
+ val + " on "
+ Thread.currentThread().getName());
});
I see subscriber only processing in one thread:
Subscriber received 10 on RxComputationThreadPool-1
Subscriber received 11 on RxComputationThreadPool-1
Subscriber received 12 on RxComputationThreadPool-1
Subscriber received 14 on RxComputationThreadPool-1
Subscriber received 15 on RxComputationThreadPool-1
Subscriber received 16 on RxComputationThreadPool-1
Subscriber received 18 on RxComputationThreadPool-1
Is there a newer updated version of this using RxJava 2.0 ? Perhaps using ParallelFlowable ?
ReplyDeleteNino Nurmadi, S.Kom
ReplyDeleteNino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom
Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom Nino Nurmadi, S.Kom
ReplyDeletebuy big chief extracts online
ReplyDeletebuy gaswoods pre rolls online
buy dankwoods online
Livechat Vivo
ReplyDeleteLivechat Vivo Slot
Customer Service Vivo Slot
Daftar Vivo Slot Via Livechat
Livechat Vivo Resmi
Deposit Live22 via Pulsa
ReplyDeleteDeposit Live22 Pulsa
Deposit Live22 via Pulsa Telkomsel
Deposit Live22 via Pulsa XL
Deposit Live22 via Pulsa Tri
I trust you post again soon... Valorant Phoenix Jacket
ReplyDeleteYou can do very creative work in a particular field. Exceptional concept That was incredible share.
ReplyDeleterocketman denim jacket
I enjoyed your blog Thanks for sharing such an informative post. We are also providing the best services click on below links to visit our website.
ReplyDeleteHoliday Music
Christmas 2020 Playlist
comprar carta de condução
ReplyDeletecarteira de motorista portugal
comprar carta de condução legal
comprar a carta de condução
carteira de motorista em portugal
comprar carta de conduçao online
comprar carta de conduçao em portugal
condutor português
carta de motorista portugal
comprar carta de condução
ReplyDeletecarteira de motorista portugal
comprar carta de condução legal
comprar a carta de condução
carteira de motorista em portugal
comprar carta de conduçao online
comprar carta de conduçao em portugal
condutor português
carta de motorista portugal
comprar carta de condução
ReplyDeletecarteira de motorista portugal
comprar carta de condução legal
comprar a carta de condução
carteira de motorista em portugal
comprar carta de conduçao online
comprar carta de conduçao em portugal
condutor português
carta de motorista portugal
we work with transport office and the municipality We offer real license without exam. We are only out to facilitate the process for those who do not want to go through the normal process or who may have failed the exams
ReplyDeletecomprar carta de condução
carteira de motorista portugal
comprar carta de condução legal
comprar a carta de condução
carteira de motorista em portugal
comprar carta de conduçao online
comprar carta de conduçao em portugal
condutor português
carta de motorista portugal
This is really amazing, you are very skilled blogger. Visit Ogen Infosystem for professional website designing and SEO Services.
ReplyDeleteSEO Service in Delhi
Our the purpose is to share the reviews about the latest Jackets,Coats and Vests also share the related Movies,Gaming, Casual,Faux Leather and Leather materials available Yellowstone Rip Wheeler Jacket
ReplyDeleteNice Blog !
ReplyDeleteHere We are Specialist in Manufacturing of Movies, Gaming, Casual, Faux Leather Jackets, Coats And Vests See Hughie Campbell Jacket
Thank you for posting such a nice post. Keep posting. It is really helpful. Chronicles Santa Claus Coat
ReplyDeleteFollow the latest trends and leave your impression on viewers mind wearing this titled Beth Dutton Blue Coat . Buy it and enjoy flat 80% off on all items.
ReplyDeleteThis blog was very nicely formatted; it maintained a flow from the first word to the last. First Aid Usmle
ReplyDeleteMua vé máy bay tại đại lý Aivivu, tham khảo
ReplyDeletevé máy bay đi Mỹ
gia ve tu my ve vietnam
ve may bay tư duc ve viet nam
giá vé máy bay từ moscow về hà nội
Your articles always have been very informative to me. They are very cognitive and prudently explained. I urge you to update us always without fail.
ReplyDeleteBanquet hall in Meerut
Top 10 CBSE Schools Meerut
Web Developer in Meerut
SEO Company in Hapur
SEO Company in Ghaziabad
Non Availability of Birth Certificate in Hyderabad
Website designing company in Meerut
Xmedia Solutions
ReplyDeleteXmedia Solution About us in usa
Xmedia Solution infrastructure in usa
Xmedia Solution Career in usa
Xmedia Solution Contact us in usa
ReplyDeleteThanks for sharing this awesome blog nowadays people won't write quality content rarely I found a quality blog on this topic.
You need to rigorously deal with the sales process and it's every stage to meet your revenue goals and achieve the maximum sales figure of your own organization. To achieve successful
Sales Process Management, there is an urgent requirement to observe your sales team's performance, observe each and every movement taken for a particular thing.
I'm so glad and enjoyed your BLOG, It is very informative on the subject or topic, and Thanks For Sharing this post. I have something to share here
ReplyDeletebuy modalert online
buy artvigil online
buy waklert online
buy modvigil online
buy vilafinil online
Pharmamedsstore is the Best place to Buy Modalert Online and to also buy other medicines online with overnight delivery. Modalert 200 is made by Sun Pharma. it is an energiser drug that improves individuals’ memory, Vigilance, and attentiveness
ReplyDeletemodalert 200mg by sun pharma
provides the quality service of customized fiber connections in the case of large businesses and government entities.
ReplyDeleteRaiders Silver Jacket
Don’t stop talking about these topics. It’s just too important for us. My mind feel better after reading this. So give it to thumbs up!
ReplyDeleteThis is enough to make anyone happy. Because this makes our mind fresh I feel happy to come to here.
ReplyDeletemarine engine spares
ReplyDeleteships spares
european marine spares
wecareyourmeds is the best place to buy opana online and also to buy other medicines online overnight Opana (oxymorphone) is an opiate desolation drug. An opiate is sometimes called a sedative.
ReplyDeletebuy opana 40mg online
buy oxycontin online
Buy
ReplyDeletevyvanse
Online
Buy pain relief medicine in USA, Canada
ReplyDelete• oxycodone-30mg Adderall XR 20mg
ReplyDeleteUSA Pharmacy lists is the place where you can buy all your medicines online at one place
ReplyDeleteWe’re specialized in delivering genuine medicines with overnight delivery. Almost all payment modes are accepted. To buy online visit our website https://www.realpharmaneeds.com or write to us at realpharmaneeds@gmail.com.
ReplyDeleteorder tramadol 50mg online overnight delivery
order tramadol 100mg online overnight delivery
order ultram 50mg online overnight delivery
order vicodin es 7.5/750mg online overnight delivery
order vyvanse 20mg online overnight delivery
SearchOnlineMeds is an amazing blog to acquire all the knowledge about medicines and its uses.
ReplyDeleteorder phentermine
order percocet online without prescription
order phentermine
order hydrocodone
Information security services in India
ReplyDeleteInformation security services in chennai
Polishing machine manufacturers
ReplyDeleteBelt grinder manufacturers
volunteer in orphanage
ReplyDeleteOrphanage in ambattur
Special school
sciroppo-di-metadone
ReplyDeleteacquista-phentermine-online
acquista-eroina-bianca
tramadolo-hcl-200mg
acquistare-dapoxetina-online
acquista-adma-online
acquista-depalgo-online
acquista-instanyl-online
acquista-adderall-30mg
ReplyDeleteacquista-adipex-online
acquista-ambien
acquista-ativan-online
acquista-botox-online
acquista-cerotti-al-fentanil
acquista-codeina-online
acquista-demerol-online
buy-dianabol-online
ReplyDeletebuy-oramorph-online
buy-bromazepam-online
buy-morphine-sulphate-injection
buy-valium-online
buy-ultram-online
buy-soma-online
I was very impressed by this post, this site has always been pleasant news Thank you very much for such an interesting post, and I meet them more often then I visited this site. Leon The Professional Coat
ReplyDeletecomprar-adderall-xr
ReplyDeletecomprar-adipex-en-linea
comprar-ambien-en-linea
comprar-ativan
comprar-blue-xanax
comprar-botox-en-linea
modalert 200 mg by sun pharma
ReplyDeletemodalert sun pharma
buy ketamine powder
ReplyDeletebuy mdma crystal
buy methamphentamine
buy micro mushrooms
buy morphine pills
buy nembutal liquid
buy nembutal pills
Hey
ReplyDeletePretty good post. I have really enjoyed reading your blog posts. Anyway, I hope you post again soon. Big thanks for the useful info.
buy hydrocodone 10/325mg online
buy hydrocodone 10/500mg online
buy hydrocodone 7.5/325mg online
buy lortab 10mg online
buy methadone 5mg online
buy methadone 10mg online
I love this blog. I don’t know what I’d do without you and your great info! Thank you so
ReplyDeletemuch! I always come here.
buy clonazepam 2mg online
buy concerta 54mg online
buy dilaudid 8mg online
buy fioricet 40mg online
buy hydrocodone 2.5/500mg online
buy hydrocodone 5/500mg online
Amazing feed
ReplyDeleteloved the article
I was searching for the type of high-quality content…
buy desoxyn online
ReplyDeletebuy dexedrine
buy dilaudid pill
buy dmt online usa
buy etizolam usa
buy fentanyl online
agen bandarq
ReplyDeleteagen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
===
ReplyDeleteagen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
ReplyDeleteagen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
agen bandarq
buy-vicodin-online
ReplyDeletedemerol
buy-ritalin-online
buy-hydrocodone-online
buy-endocet-online
buy-opana-online
buy-oxynorm-online
I really enjoy studying on this site, it holds fantastic blog posts
ReplyDeletebuy ritalin 10mg online Belgium
You should keep it up forever! Best of luck.
You have performed a great job on this article buy eureka carts online with bitcoin
ReplyDeleteI really appreciate your website
Are you planning to create an application for your business and looking for an Android App Developer in Meerut? Grab the opportunity to get a discount on Android application Services in Meerut. Get to know Sandeep Sharma a leading and a renowned android app developer located in Meerut and working at Techdost Services Private Limited!
ReplyDeleteSandeep Sharma is an organised, trustworthy and reliable Android app developer in Meerut, providing high-quality and cost-effective Android app development services in Delhi and all over India.
Android app developer in Meerut
Hey Nice Blog!!!
ReplyDeleteThank you for sharing the information. Wonderful blog & good post.Its really helpful for me, waiting for a more new post. Keep Blogging!!!
buy Soma without prescription
Buy Soma Online USA
Buy Soma Online Legally
Cheap Soma Online
Buy Cenforce 100mg online
Buy Viagra 100mg online
Buy Viagra Online without Prescription
Viagra For Sale Online
Enjoyed reading the article above, really explains everything in detail, the article is very interesting and effective. Thank you and good luck for the upcoming articles...For more please visit: Web Development Company USA...
ReplyDeleteHey Nice Blog!!!
ReplyDeleteThank you for sharing the information. Wonderful blog & good post.Its really helpful for me, waiting for a more new post. Keep Blogging!!!
Buy Soma 350mg Online
Buy Soma 500mg Online
Buy Valium Online
Buy Valium 10mg Online
Order Valium Online
buy Soma without prescription
Buy Soma Online USA
Buy Soma Online Legally
Cheap Soma Online
Awesome post that explains the effects of using subscribeOn in the chain. Let's assume that the intenseComputation function internally calls subscribeOn (which I cannot edit) but we don't want the chain to be called in parallel. Is that possible?
ReplyDeleteThanks for sharing the wonderful post with us!It is given by mouth or by injection.Ivermectin 3mg price in usa, Ivermectin 3mg tablets for sale,Ivermectin 3mg dosage, Ivermectin 3mg online,As an analeptic, modafinil 200mg can treat narcolepsy, obstructive sleep apnea and shift work disorder.
ReplyDeleteivermectin 12mg side effects
fluoxetine 40mg dosage
Hydrochloroquine 200 mg side effects
Modafinil 200mg tablets price
Cracked Glass Repair
ReplyDeleteLiberal KS Bug Exterminator
Investor Friendly Contracting Kansas City
Contractor Near Me
sell My House Now
Online High School Fundraiser
These are truly great ideas in about blogging. You have touched some good things here.
ReplyDeleteAny way keep up wrinting. Buy Vyvanse Cap 70mg online Indonesia
comprar carta de conducao
ReplyDeletecarta de conducao precos
carta de conducao renovacao
carta de conducao online
carta de condução categorias
carta de condução b
comprar carta de condução
flash bitcoin generator software
구미출장안마
ReplyDeleteHey! I am Gregory Gladiya. I am here from the technical team to assist you in resolving the Epson printer issues. For further information on on driver install, click here: Epson ET 2760 Driver. Here you will be able to find a solution to resolve issues that are faced with Epson printers of any model.
ReplyDeleteBecause you've seen this tweet, wherever you name is mentioned, Grace will speak for you.
ReplyDeletecomprare patente di Guida
comprar carta de conducao
420Buds
We are looking for an informative post it is very helpful thanks for sharing it. We are offering all types of leather jackets with worldwide free shipping.
ReplyDeleteLEATHER MOTORCYCLE JACKETS
MOTOGP LEATHER JACKETS
MOTOGP LEATHER SUITS
HARLEY DAVIDSON JACKETS
STUDDED LEATHER JACKET
This is enough to buy piles tablet. Because this makes our buy piles tablet. I feel happy to come to here.
ReplyDelete
ReplyDeleteसुरक्षित आयुर्वेदा न केवल आपको आयुर्वेदिक दवाओं और जड़ी-बूटियों से जोड़ता है, बल्कि यह आपको अच्छे जीवन, स्वास्थ्य और कल्याण से भी जोड़ता है, यह आपको स्वस्थ भोजन और स्वस्थ जीवन शैली के बारे में मार्गदर्शन करता है।
나주출장안마
ReplyDeleteKamagra Polo is a powerful medication helpful for treating Erectile Dysfunction or Male Impotence.
ReplyDeleteBuy Sildenafil 100mg
Buy Kamagra Polo
You can also e-mail us at: sales@Rsmenterprises.In
Or Chat on WhatsApp with +91 92163-25377
I am very impressed to read this blog. I hope you will continue to upload similar blogs. Thank you very much. I have an online store with the name FLYING LEATHER JACKET please visit for an awesome collection.
ReplyDeleteMEN AVIATOR LEATHER JACKETS
B3 BOMBER JACKETS
MOTOGP LEATHER SUIT
MOTOGP LEATHER JACKETS
Nice blog .
ReplyDeleteBuy Armodafinil 150mg to stay awake all day.
Buying drugs and chemicals online from a Drug Weberph shop guarantees your safety, this is so because we have quality Chemicals, Pills, and drugs that are ready to be shipped out to any country. Also, the prices we offer can also help you save money as the products are quite affordable.
ReplyDelete
ReplyDeleteAwesome.. geweldig...grymt bra...fantastisch
Kopa Korkort
Rijbewijs Kopen
fuhrerschein kaufen
comprare patente
acheter permis de conduire belgique
acheter permis de conduire en suisse
führerschein kaufen schweiz
rijbewijs Kopen België
nederlands-rijbewijs
comprare patente di Guida
ReplyDeleteköp Oxycodone 30/80mg i sverige
ReplyDeleteKöp Oxynorm 20mg i Sverige
köpa morfin på nätet
beställa subutex 8 mgt
köpa morfin på nätet
köpa oxycontin 40mg
köp oxycontin 80mg i sverige
Köp Quaaludes online
beställ Ambien (Zolpidem) 10 MG online
köpa sobril på nätet
ReplyDeleteAwesome.. geweldig...grymt bra...fantastisch
Carta de Conducao
Kopa Korkort
Rijbewijs Kopen
fuhrerschein kaufen
comprare patente
acheter permis de conduire belgique
acheter permis de conduire en suisse
führerschein kaufen schweiz
rijbewijs Kopen België
nederlands-rijbewijs
absolutely a good info to know.. thanks for sharing... need to read more of such
acquista la tua patente italian frivers
ReplyDeleteAcquistapatentediguida
Servizi
Chi Siamo
DomandeFrequenti
comeottenereunapatentediguidasenzaesamediguida
Buy Purple Monkey strain online from stonerssurplusshop. Purple Monkey strain Buds ar a grade A+ strain and belong to the Indica kind. they’re primarily a combination of a strain from Northern Calif. referred to as Grand daddy purple ANd an Afghani Indica called Deep Chunk. they’re kind of like Grand father in look, however have a special odour. Flavors, on the opposite hand, ar implausibly appealing and embrace grape, pine, and a sweet berry note that has users questioning if this can be more of a course strain or one that’s best enjoyed around mealtime. Buy Blueberry Muffin Strain is famed for its spectacular flavor and euphoriant highs. This strain was created by the enduring stockman DJ short. Blueberry’s parent strains square measure crosses between the indica Afghani and 2 sativas of Thai and Purple Thai. It 1st emerged within the late Seventies within the European nation. Buy Diazepam Online is mainly used to treat anxiety, insomnia, panic attacks and symptoms of acute alcohol withdrawal. It is also used as a premedication for inducing sedation, anxiolysis, or amnesia before certain medical procedures (e.g., endoscopy). In 2020, it was approved for use in the United States as a nasal spray to interrupt seizure activity in people with epilepsy. Diazepam is the drug of choice for treating benzodiazepine dependence with its long half-life allowing easier dose reduction. Benzodiazepines have a relatively low toxicity in overdose.
ReplyDeletehttps://comprarepatentediguide.com/comprare-la-patente/
ReplyDeletehttps://comprarepatentediguide.com/dove-e-piu-facile-prendere-la-patente/
https://comprarepatentediguide.com/patente-di-guida-legittima/
https://comprarepatentediguide.com/patente-b/
https://comprarepatentediguide.com/comprare-patente-b/
https://comprarepatentediguide.com/comprare-patente-b-napoli/
https://comprarepatentediguide.com/patente-a/
https://comprarepatentediguide.com/patente-internazionale/
https://comprarepatentediguide.com/
führerschein kaufen ohne prüfung
comprar carnet conducir
Comprare la Patente
köpa körkort
comprar carta de conducao
Rijbewijs Kopen
kupite vozačka dozvola
I saw this amazing article and felt you should see it. Check it out and get new tips
ReplyDeleteAcquistapatentediguida
Servizi
Chi Siamo
DomandeFrequenti
comeottenereunapatentediguidasenzaesamediguida
contattaci
rijbewijs kopen
ReplyDeletenederlands-rijbewijs
geregistreerd-rijbewijs-kopen-2021
betrouwbaar-rijbewijs
ReplyDeleterijbewijs-kopen-in-belgie
rijbewijs-kopen-voor-nederland
authentiekrijbewijs
Thank you for sharing. Nice article you have here Buy Steroids Online moreover the admin of this site has really worked hard for all this once more thanks for sharing your articles.
ReplyDeleteBuy Oxytropin Online
Buy Soliris Online
Buy Humatrope Online
Buy Hcg Online
Buy Enanthate Online
Buy Parabolan Online
Buy Trenbolone Online
Buy Testo-Prop Online
Buy PrimobolanOnline
Buy Serostim Online
Buy Deca Online
Buy Testanon Online
Buy Tri-Tren Online
Buy NPP Online
Buy Turinabol Online
Buy Anadrol Online
Buy Anavar Online
Buy Boldenone Online
Buy Testosterone Cypionate Online
Buy Winstrol Online
Buy Masteron Online
Buy Clenbuterol Online
Buy Danabol Online
Thanks for sharing this nice blog. And thanks for the information. Will like to read more from this blog.
ReplyDeletepermis de conduire
permis de conduire renouvellement
comprar carta de condução
compra prontos de conducao
führerschein kaufen
mpu Gutachten kaufen
führerschein ohne Prüfung kaufen
comprare patente registrata
patente di guida italiana
geregistreerd-rijbewijs-kopen-2021
ReplyDeletebetrouwbaar-rijbewijs
rijbewijs-kopen-in-belgie
rijbewijs-kopen-voor-nederland
authentiekrijbewijs
https://highlandelectronics.net/
ReplyDeleteWe are famous among the best electronics online store, especially when you Buy Playstation Online, Xbox for sale, Apple
phone accessories and more.
https://highlandelectronics.net/
text/whatsapp : +1(702) 637-0962
Buy Canaan Avalon Miner 1166 Pro
Canaan Avalon Miner 1166 Pro
Buy Antminer Z15 420sol/s
Antminer Z15 420sol/s
IPad Pro 12.9-inch for sale
Buy IPad Pro 12.9-inch online
Buy STM Charge Tree Swing online
Order STM Charge Tree Swing
Apple iPhone 13 Pro Max Gold for sale
Apple iPhone 13 Pro Max Gold
Apple iPhone 13 Pro 128GB Gold for sale
Buy Apple iPhone 13 Pro Gold
Buy Apple Watch Series 7 Online
Apple Watch Series 7 for sale
Buy iPhone 13 Pro Max online
iPhone 13 Pro Max for sale online
Buy iPhone 13 Pro online
iPhone 13 Pro for sale
order iPhone 13 pro
iPhone 13 for sale online
Buy iPhone 13 online
Order iPhone 13 online
Buy iPad Air 10.9-inch Online
iPad Air 10.9-inch for sale
Buy MacBook Air 13-inch Online
MacBook Air 13-inch for sale
Wholesale MacBook Pro 13 online
Buy MacBook Pro 13 online
Buy ASUS Chromebook Flip C434 Online
ASUS Chromebook Flip C434
Buy Amazon Fire TV Stick 4K Online
patente b
ReplyDeletepatente-a
rinnovo patente
quiz patente
comprare patente
ReplyDeletevreau sa cumpar permis de conducere original
vreau sa cumpar permis de conducere
cumpara permis de conducere
authentiekrijbewijsköpa körkort
ReplyDeleteComprar Carnet de conducir
acheter un permis de conduire
comprar carta de condução
buy ielts without exam
geregistreerd rijbewijs kopen
that was an amazing post, good all through
ReplyDeleteCarta de Conducao
Buy driving license
Comprar Licencia de Conducir
Permis de Conduire
Genuine IELTS Certicate without exams
Kup Prawo Jazdy
rijbewijs kopen Nederland
Kup Prawo Jazdy
geregistreerd-rijbewijs-kopen-2021
rijbewijs kopen
incredible, need information such as this
rijbewijs-kopen
ReplyDeleteFührerschein kaufen
acheter-un-permis-de-conduire
buy-driving-licence
comprar carta de condução
Comprare la patente
kupiti vozačku dozvolu
Nice post.
ReplyDeletecapecitabine 500 mg tablet to promote wakefulness.
Grace will speak for you.
ReplyDeletecomprare patente di Guida
comprar carta de conducao
420Buds
rijbewijs kopen
ReplyDeletenederlands-rijbewijs
geregistreerd-rijbewijs-kopen-2021
betrouwbaar-rijbewijs
rijbewijs-kopen-in-belgie
ReplyDeleterijbewijs-kopen-voor-nederland
authentiekrijbewijs
Thank you for sharing this blog.
ReplyDeleteOxaliplatin Injection at low price to overcome from cancer.
Patente di guida italiana
ReplyDeletepatente b
patente-a
rinnovo patente
quiz patente
comprare patente
Führerschein kaufen
ReplyDeleteacheter-un-permis-de-conduire
buy-driving-licence
comprar carta de condução
ReplyDeleteAwesome.. geweldig...grymt bra...fantastisch
Carta de Conducao
Kopa Korkort
Rijbewijs Kopen
fuhrerschein kaufen
comprare patente
acheter permis de conduire belgique
acheter permis de conduire en suisse
führerschein kaufen schweiz
rijbewijs Kopen België
rijbewijs-kopen
absolutely a good info to know.. thanks for sharing... need to read more of such
Patente di guida italiana
ReplyDeletecomprare la patente
patente internazionale
patente di guida legittima
comprare patente b Napoli
comprare patente b
Hey friend, it is very well written article, thank you for the valuable and useful information you provide in this post. Keep up the good work! FYI, How to know if your dog is having a heat stroke , BMO Harris Cashback Mastercard Credit Card Review , before the coffee gets cold,Impact of Social Media on Youth Essay for Students , FREE BOOKS PDF
ReplyDeleteComprare la patente
ReplyDeletekupiti vozačku dozvolu
Comprare la patente
comprar carta de condução
rijbewijs-kopen
Führerschein kaufen
speak for you.
ReplyDeletecomprare patente di Guida
420Buds
https://xn--eu-registrierterfhrerschein-y3c.com/
ReplyDeletehttps://comprar-carnetdeconducir.com/
https://xn--eu-registrierterfhrerschein-y3c.com/
https://comprarepatentelegalmente.com/
https://legaldispensary.online/
vreau sa cumpar permis de conducere original
ReplyDeletevreau sa cumpar permis de conducere
cumpara permis de conducere
Permis de conducere romania
rijbewijs-kopen
ReplyDeleteFührerschein kaufen
Surkashit Ayurveda can help with your overall health and wellbeing, and Ayurveda is a brilliant lifestyle choice for improving digestion, immunity
ReplyDeleteSurkashit Ayurveda FatGul Capsule Weight Loss
Surkashit Ayurveda Gas Digestion
Surkashit Ayurveda food Digest Food
that was an amazing post, good all through
ReplyDeleteCarta de Conducao
Buy driving license
Comprar Licencia de Conducir
Permis de Conduire
Genuine IELTS Certicate without exams
Carta de Conducao
Kup Prawo Jazdy
rijbewijs kopen Nederland
Kup Prawo Jazdy
Führerschein kaufen
incredible, need information such as this
fuboTV subscribers may also take benefit of the Cloud DVR characteristic to file stay applications from a range of channels earlier than or all through authentic airings. FuboTv functions on the apple TV, fire TV. You can enjoy local channels of live sports and news with the HD quality of video resolution. fubotv connect enter code
ReplyDeletefuboTV is on hand on today’s mainstream platforms. We will discuss some of the common errors that you may encounter while viewing FuboTV. At times, you may encounter errors when you try to fuboTv connect. We have curated a list of all such errors and how you can resolve them.
ReplyDeletefubo tv connect code
Need the Microsoft Azure Interview Questions And Answers? Get this into the blog with Infycle Technologies for having the top interview questions and answers! Call 7504633633 or 7502633633 for having the best software development courses!
ReplyDeleteเล่น Mega Game เงินดีกว่าเล่นเกมในการีน่า ผู้เล่นสามารถเข้ามาร่วมปราบเงินโบนัสจากพวกเราเข้ากระเป๋าได้ไม่ยากมีเกมให้เลือกเล่นมากกว่า 1,000 เกมพร้อมระบบล้ำยุคที่สุดปี 2022 Mega Game
ReplyDeletecricket bat companies
ReplyDeletebest cricket bat for leather ball
Cricket Gloves
kashmir willow cricket bat
batting pads
cricket net price
cricket bat
leather cricket ball
mongoose bat english willow
cricket training net
vozačka dozvola
ReplyDeleterijbewijs
Führerschein
permis de conduire
driving licence
vozačka dozvola
Führerschein
Führerschein
Best Ayurvedic Medicine company in india Surkashit Ayurveda
ReplyDeleteSurkashit Ayurveda Skin Allergy
Surkashit Ayurveda Skin Allergy
Surkashit Ayurveda joint pain
Surkashit Ayurveda FatGul Capsule Weight Loss
Surkashit Ayurveda Gas Digestion
Surkashit Ayurveda food Digest Food
blog interessante
ReplyDeletecomprare la patente di guida reale
è legale comprare la patente
I am a blogger...
ReplyDeletelayers of fear 2 pc game
blur free download
rush for berlin gold pc game
ReplyDeletekupite vozačka dozvola
Köp körkort online
Rijbewijs Kopen
comprar carnet conducir
ReplyDeleteComprare la Patente
acheter un permis de conduire
köpa körkort
führerschein kaufen ohne prüfung
Ostaa Ajokortti
ReplyDeleteBuy a Driving Licence/
Comprar Carteira de Motorista
Comprar-Permiso-de-Conducir
I am a blogger and I really like this blog. THis blog is too much best.
ReplyDeleteaground game unlocked pc game
floppy heroes highly compressed pc game
cryogear codex pc game
save our souls episode i the absurd hopes of blessed children free pc game
tdirt 4 free download pc game
ReplyDeleteVideoProc Crack
Eset Internet Security Crack
Gravit Designer Pro Crack
WavePad Sound Editor Crack