È vero che per il funzionamento di Observer Pattern, probabilmente c'è qualche meccanismo di polling sotto?

5

La domanda breve è: è vero che per il funzionamento di Observer Pattern, probabilmente c'è qualche meccanismo di polling sotto? (aggiornamento: in una situazione di rete)

È stato piuttosto sorprendente che se sul mio Macbook Pro salvassi un file Hello World.txt nella cartella Dropbox, in realtà lo vedo comparire sul mio altro MacBook entro 1 secondo o 2.

È ancora più sorprendente che, sull'altro Macbook, se eseguo una ricerca su Hello come corrispondenza del nome, e che Hello World.txt venga visualizzato lì come risultato di ricerca, ora vado sul mio Macbook Pro e rinominare il file come Hello World HiHi.txt , dopo 1 secondo o 2, quindi il nuovo nome viene effettivamente mostrato nel risultato della ricerca dell'altro Macbook. Cioè, i risultati della ricerca probabilmente osservano le modifiche di ogni cartella e la cartella osserva nello stato Dropbox le modifiche in remoto sul sito Web di Dropbox.

Quindi immagino che l'app Dropbox abbia probabilmente una connessione TCP / IP a due vie in modo che il server Dropbox possa avviare un messaggio all'app di Dropbox in background del mio Macbook, dicendo "Ehi, il contenuto della cartella è cambiato sul server ", quindi l'app di Dropbox in background sul mio Macbook eseguirà la ridenominazione e l'oggetto della cartella (il modello o l'oggetto dati) invierà una notifica all'oggetto della cartella di ricerca," Ehi, il mio contenuto è cambiato "e la cartella di ricerca l'oggetto notificherà quindi l'oggetto vista cartella, dicendo "Ehi, il risultato della ricerca è cambiato (e quindi probabilmente vorrai aggiornare la vista sullo schermo)".

Quindi penso che forse è più o meno come ha funzionato? Ma la domanda è, se non ci fosse alcuna connessione TCP / IP a due vie, allora è vero che l'app di Dropbox in background dovrà interrogare il server Dropbox ogni 1 o 2 secondi per chiedere "ha fatto qualcosa cambiato?" E questo sarà troppo impegnativo per il server Dropbox.

Tuttavia, non è vero che nonostante ci sia una comunicazione bidirezionale, alcuni in basso sotto i livelli TCP / IP (i 7 livelli OSI), c'è qualche tipo di polling?

Ad esempio, il server Dropbox, a un livello molto basso, non può spingere un elettrone sul mio router, notificando il mio Macbook, perché se c'è un firewall, allora in qualche modo, da parte mia, ci deve essere una sorta di polling a basso livello, altrimenti il server Dropbox non può passare attraverso il mio firewall.

Oppure, se visualizzato in questo modo: se sto usando il WiFi sul mio Macbook, probabilmente non c'è alcun meccanismo del server Dropbox che spinga qualcosa al mio router wireless, e quindi usi l'onda elettromagnetica per spingere sul mio MacBook, per avvisarmi? Cioè, il mio Macbook deve continuamente chiedere al router wireless, "qualsiasi cosa nuova per me?" Perché se il Macbook non chiede: se il Macbook si è bloccato o se il firmware wireless del Macbook si è bloccato e non si sta chiedendo, non c'è davvero alcuna "spinta dei dati" dal router wireless al Macbook. Il Macbook deve davvero "chiedere continuamente".

Non è simile al caso che, se JavaScript su un browser non avesse una connessione bidirezionale (prima di HTML5), in qualche modo possiamo ancora avere il server web "notifica il codice JavaScript del browser", ma ci saranno alcuni tipo di polling sotto scritto in JavaScript, per simulare una connessione a due vie?

Aggiornamento: non intendo il polling necessario per il server, ma intendo solo che un qualche tipo di meccanismo deve costantemente guardare per vedere se c'è qualcosa di nuovo , se è Observer Pattern all'interno del codice in una app, quindi la CPU "salterà" semplicemente il codice per eseguire il codice dell'osservatore, e quindi l'osservatore non deve fare assolutamente nulla. Ma per modello di Observer su una rete, ciò che intendo è, ad esempio, se si dispone del proprio computer notebook tramite Wifi e si spegne il Wifi, quindi il Pattern di Osservatore non funzionerà. Ora accendi il Wifi, ma il firmware o l'hardware del Wi-Fi devono davvero "sentire" se è arrivato qualcosa di nuovo, perché il segnale Wifi non ha modo di "forzare il computer", non come il processore Intel può semplicemente "saltare" "a un pezzo di codice. Quindi, se il firmware o l'hardware devono costantemente "sentire" se c'è qualcosa di nuovo, questo è ciò che intendo per sondaggio: l'Observer non può essere totalmente in attesa; alcuni meccanismi devono controllare costantemente qualcosa.

    
posta 太極者無極而生 21.12.2015 - 18:55
fonte

4 risposte

4

In realtà, penso che tu abbia fatto all'indietro. Al basso livello di Internet, non esiste il polling. Tutto su Internet in realtà spinge.

I messaggi Internet sono fatti di pacchetti, che sono sostanzialmente mazzi di elettroni che viaggiano giù per i fili. Dal punto di vista del computer, i pacchetti si mostrano semplicemente come elettroni che scendono lungo un filo o onde elettromagnetiche rilevate dalla radio. Niente richiede mai pacchetti, essi ricevono pacchetti inviati sul mezzo di comunicazione.

Quando visiti un sito web, ciò che accade è che invii un sacco di pacchetti al server, che risponde inviando indietro un pacco di pacchetti. Pensiamo a questo come polling, perché hai inviato i pacchetti prima di istanziare la richiesta. Ma al livello basso di Internet, quello che è successo è che hai inviato messaggi al server e il server ti è appena tornato in un secondo momento.

For example, the Dropbox server, at the very low level, cannot push an electron to my router, notifying my Macbook, because what if there is a firewall, then somehow, on my side, there must be some kind of polling at low level, or else the Dropbox server cannot push through my firewall.

No, il firewall accetta ogni elettrone in ogni pacchetto che gli viene inviato. Semplicemente getta via quei pacchetti che ritiene sospetti. Nel caso di dropbox, poiché il tuo computer stava parlando con dropbox, non considera il pacchetto sospetto e quindi inoltra i pacchetti.

That is, my Macbook has to constantly ask the wireless router, "any thing new for me?"

No, il tuo Macbook non chiede mai se c'è qualcosa di nuovo. Piuttosto, ascolta un segnale wireless dal router. Il router presume fondamentalmente che il Macbook desideri sempre i messaggi e li invia non appena arrivano.

Isn't it similar to the case that, if JavaScript on a browser had no two-way connection (before HTML5), somehow we can still have the web server "notify the browser's JavaScript code", but there will be some kind of polling underneath written in JavaScript, to simulate a two-way connection?

No, javascript è stato limitato a causa di una stranezza di come è stato sviluppato. La tecnologia Internet sottostante ha sempre supportato pienamente la comunicazione bidirezionale.

    
risposta data 21.12.2015 - 23:01
fonte
1

In pratica, questo è spesso vero, ma solo perché il pattern Observer è spesso usato come un'astrazione su alcuni meccanismi di polling esistenti. Non c'è nulla che ti impedisca di usare Observers sopra i meccanismi di non-polling.

L'esempio tipico di un sistema evento / osservatore implementato sopra il polling è rappresentato dagli eventi tastiera / mouse. Il sistema operativo gestisce il polling dell'hardware e dice a ciascuna applicazione quando vede anche l'applicazione interessata.

La mia tipica motivazione per l'utilizzo di un sistema Event / Observer quando non si sta effettuando il polling è il disaccoppiamento di diverse parti di un programma che non dovrebbero sapere molto l'una sull'altra. Ad esempio, se il tuo programma si iscrive a nuovi post di scambio di stack, la tua classe Subscriber può attivare un evento NewPost che tutte le tue classi UI ascoltano. In questo modo, l'Abbonato non deve mai sapere quali sono le classi UI o quali eventi a cui tengono. Questa pagina contiene alcuni esempi più dettagliati .

Ciò che è vero al livello più basso è che ci deve essere qualche hardware o software attivo in ogni momento per generare eventi. Questo può essere di basso livello come un segnale in arrivo che causa interruzioni hardware, o di alto livello come un "loop di gioco" che chiama i giocatori di IA ogni fotogramma per generare vari eventi per le classi dell'interfaccia utente. Non classificherei questi due esempi come "polling", anche se suppongo che potresti farlo se lo volessi davvero.

    
risposta data 21.12.2015 - 20:41
fonte
0

Certo, se nessuno ti notifica automaticamente una modifica, devi chiedere esplicitamente un aggiornamento, periodicamente o ogni volta che ne hai effettivamente bisogno.

Ma se usi TCP, UDP o qualsiasi altra cosa, dato che il protocollo sottostante non è importante, la cosa cruciale è se la comunicazione è bidirezionale o strettamente a senso unico.

    
risposta data 21.12.2015 - 19:16
fonte
0

Il polling è un costrutto software ed è generalmente inefficiente per operazioni IO di basso livello.

Quando si rinomina un file e la propagazione passa a un altro pc collegato, sono molte le forme del modello di osservatore, dal clic del mouse per avviare l'operazione di ridenominazione, al file modificato nella cartella osservata sull'altro pc.

Observer è una variante di publish-subscribe e si applica anche a livello di rete o di dati. Vedi link per il TCP Analogia di indirizzamento UDP.

L'hardware è progettato per generare interrupt quando le cose accadono. Anche il software che si abbona agli interrupt è come il pattern Observer. All'interno dell'hardware si può pensare a "chiedere costantemente" o rilevare se è successo qualcosa di importante, quindi il software non deve.

    
risposta data 22.12.2015 - 05:45
fonte

Leggi altre domande sui tag