Lassen Sie uns sagen, dass ich eine BufferBlock
mit einer beschränkten Kapazität von 2 haben, und ich verknüpfen (mit LinkTo()
) eine ActionBlock mit MaxDegreeOfParallelism = 2. Nun, ich weiß, dass ich sofort in der Lage sein wird, zwei Elemente in die Puffer zu senden und die ActionBlock wird fange an, sie sofort zu verarbeiten. Nehmen wir an, die Aktionen dauern ein paar Sekunden. Kann ich zwei weitere Objekte in den Puffer senden, während die ersten Aktionen ausgeführt werden oder wird ein Objekt erst aus dem Puffer entfernt, nachdem die Aktion, die es verbraucht, abgeschlossen ist?Werden Elemente aus BufferBlock entfernt, wenn ActionBlock gestartet oder beendet wird?
1
A
Antwort
1
Wenn Ihre ActionBlock
über eine nicht gebundene Kapazität verfügt, ist die begrenzte Kapazität auf Ihrer nicht von Bedeutung, die ActionBlock
puffert alle Ihre Elemente, bis der Arbeitsspeicher erschöpft ist. Wenn Sie jedoch BoundedCapcity
auf Ihrem ActionBlock
zu 2 sowie MaxDegreeParallelism
zu 2 gesetzt haben, wird es zwei Nachrichten verarbeiten und 2 Nachrichten in seinem Puffer speichern. Dann puffert Ihr Pufferblock 2 zusätzliche Nachrichten. Alle zusätzlichen Nachrichten müssen auf die Kapazität in Ihrer Pipeline warten. Der beste Weg, auf Freiraum zu warten, ist await myPipeline.SendAsync(data)
. Insgesamt hätten Sie eine Kapazität von 6 für die gesamte Pipeline.
Verwandte Themen
- 1. Hook zerstören, wenn HTML-Elemente entfernt werden
- 2. Postgres wird sofort beendet, wenn docker-compose gestartet wird
- 3. Android-Dienst wird neu gestartet, wenn die Anwendung beendet wird
- 4. onStartCommand nach dem Serviceprozess wird beendet, wenn mit START_STICKY gestartet
- 5. Werden lokal erstellte Objekte freigegeben, wenn ihr ViewController beendet wird?
- 6. Ausbrechen einer Schleife, wenn Benutzereingaben beendet oder beendet werden C#
- 7. RecyclerView-Elemente werden nicht entfernt
- 8. Quartz: Wie kann eine Reihe von Jobs entfernt werden, wenn ein anderer Job gestartet wird?
- 9. Verknüpfen von dynamisch erstellten ActionBlocks mit einem BufferBlock
- 10. Wann werden iOS Keychain-Elemente entfernt?
- 11. Wie kann die Benachrichtigung entfernt werden, wenn die Anwendung vom System beendet wird?
- 12. Wenn Hibernate entfernt wird, werden gelöschte Objekte aus dem Speicher entfernt NonUniqueObjectException
- 13. Transformerblock nicht an Actionblock
- 14. Ruby, wie Elemente aus dem Hash-Array entfernt werden?
- 15. Benachrichtigungen in UIWebView, dass die Textauswahl gestartet oder beendet wurde?
- 16. App wird nicht beendet/neu gestartet, wenn die Standortgenehmigung aufgehoben wird, während die App läuft
- 17. DnssdServiceInstance wird nie aus dem Netzwerk entfernt
- 18. .jar wird nicht gestartet, wenn es aus dem C# -Programm gestartet wird
- 19. deaktivieren Sie klicken auf Elemente aus der Mainpage, wenn ein PopUp gestartet wird
- 20. erwarten async Lambda in ActionBlock
- 21. Kann ein ActionBlock mit einem anderen ActionBlock mit mehr Parametern verknüpft werden?
- 22. `onNotificationOpened` wird nicht aufgerufen, wenn App für iOS aus dem Speicher gelöscht oder entfernt wird
- 23. Verhindern, dass das letzte Fragment aus dem Backstack entfernt wird
- 24. entfernt keine doppelten Elemente aus Array
- 25. Animiere Übergang in neue Höhe für Container-Div, wenn Elemente aus Container entfernt werden
- 26. Zeichenfolge oder Binärdaten werden abgeschnitten. Die Anweisung wird beendet
- 27. Datenbank nicht erstellt werden, wenn Projekt gestartet wird
- 28. Wird ein Bereich beendet, wenn keine Referenzen zurückgegeben werden?
- 29. Anpassen ActionBlock <T>
- 30. Android Espresso: Warten, bis die Aktivität beendet/gestartet wird
Dank Jsteward. Ich wusste nicht, dass der ActionBlock auch die Dinge puffert. Was ich eigentlich will, ist, dass nur zwei Prozesse parallel laufen, aber ich möchte keine zusätzlichen Jobs puffern. Wenn ich SendAsync zweimal anrufe, möchte ich, dass der dritte Aufruf wartet, bis einer der ersten beendet ist. Ist das möglich? – PICyourBrain
Ok, wenn du den 'BufferBlock' weglegst, hat der einzelne 'ActionBlock', der wie oben konfiguriert ist, eine Kapazität von 4. Zwei in der Verarbeitung und zwei gepufferte, werden jedoch immer nur zwei Jobs zu einer bestimmten Zeit verarbeiten. Unglücklicherweise gibt es bei Blöcken, die die 'BoundedCapacity' auf 1 setzen, immer noch einen Block mit einer Kapazität von 2, einen in der Verarbeitung und einen im Puffer und das ist der niedrigste, den du gehen kannst. – JSteward