Perché dovrei conoscere la programmazione concorrente?


17

La programmazione concorrente è piuttosto difficile per me: anche guardare una diapositiva di base mi sembra una sfida. Sembra così astratto.

Quali sono i vantaggi di conoscere bene i concetti di programmazione concorrente? Mi aiuterà nella normale programmazione sequenziale? So che c'è una soddisfazione nel capire come funzionano i nostri programmi, ma cos'altro?


3
Penso che sia un po 'complicato, ma può diventare un po' complicato se modifichi tutte le cose personali (anche se la programmazione concorrente è abbastanza difficile per tutti ) e chiedi i meriti tecnici concreti dei concetti.
yannis,

1
I benefici dovrebbero essere abbastanza evidenti. È possibile scrivere programmi che possono trarre vantaggio da tutti i miglioramenti delle prestazioni disponibili attraverso la divisione del lavoro offerta dalla programmazione concorrente. Non è facile per nessuno. Oggi è un concetto molto stimolante.
Rig

3
Non possiamo aiutarti a ottenere la motivazione per imparare qualcosa, ma la domanda generale sul perché si dovrebbe conoscere la concorrenza è abbastanza sull'argomento.

2
Conosco la programmazione concorrente. Posso dire che la diapositiva fornita non aiuta a capire. Invece, vai a una festa con i filosofi che cenano .
mouviciel,

1
Rilassati, anche i più grandi hanno difficoltà: informit.com/articles/article.aspx?p=1193856
SK-logic

Risposte:


32

Ecco una motivazione semplice e veloce: Se si vuole il codice per qualsiasi cosa, ma i più piccoli, i sistemi più deboli, si sarà essere scrivendo codice concorrente.

Vuoi scrivere per il cloud? Le istanze di calcolo nel cloud sono piccole. Non ne ottieni di grandi, ne ottieni molti di piccoli. Improvvisamente la tua piccola app web è un'app concorrente. Se lo hai progettato bene, puoi semplicemente lanciare più server man mano che guadagni clienti. Altrimenti devi imparare come mentre la tua istanza ha il suo carico medio ancorato.

OK, vuoi scrivere app desktop? Tutto ha una CPU dual-or-core. Tranne le macchine meno costose. E le persone con le macchine meno costose probabilmente non sborseranno per il tuo software costoso, vero?

Forse vuoi fare sviluppo mobile? Ehi, l'iPhone 4S ha una CPU dual-core. Il resto non sarà molto indietro.

Videogiochi? Xbox 360 è un sistema multi-CPU e la PS3 di Sony è essenzialmente un sistema multi-core.

Semplicemente non puoi allontanarti dalla programmazione simultanea a meno che tu non stia lavorando a problemi piccoli e semplici.

Aggiornamento 2016 : l'attuale iterazione del Raspberry Pi da $ 35 si basa su un sistema quad-core su un chip destinato ai telefoni cellulari. Progressi drammatici nell'IA sono stati fatti in parte grazie alla disponibilità di schede grafiche di fascia alta come motori di calcolo paralleli.


1
Anche se concordo in linea di principio, dire che Everything has a dual-or-more-core-CPU. Except the least expensive machines.sembra un po 'assurdo. Molte persone hanno macchine single-core, non perché fossero economiche, ma perché sono contente di ciò che hanno e non vedono la necessità di aggiornarle. Detto questo, pensare in termini di concorrenza aiuterà lo scheduler su un sistema single-core pure, quindi non è fatica sprecata da nessuna parte si può supporre preemptive multitasking, o (che è circa ogni ambiente multitasking maggior parte degli sviluppatori verranno in contatto con, questi giorni).
un CVn del

1
ok - è un po 'esagerato, ma il nuovo hardware tende in modo schiacciante a essere multi-core. Non lo vedo andare via. Quindi, se sei uno studente oggi che pensa al lavoro che svolgerai in futuro in modo professionale, è lecito ritenere che lavorerai su sistemi multicore.
ObscureRobot,

Mi chiedo se non sono d'accordo con la tua risposta tanto quanto saresti in disaccordo con la mia lol;)

1
Il modo in cui l'ho letto, c'è un nocciolo di somiglianza con quello che stiamo entrambi dicendo, @ acidzombie24. Sto dicendo che uno sviluppatore dovrebbe sapere come gestire la concorrenza perché sarà ovunque. Stai dicendo che non devi essere bravo nella programmazione concorrente fintanto che ... eviti le insidie ​​dei sistemi concorrenti :)
ObscureRobot

Sono d'accordo che è molto utile conoscere la concorrenza, ma non sono d'accordo che puoi evitarlo solo per "piccoli, semplici problemi". È possibile allontanarsi molto dalla concorrenza, anche in sistemi non banali, ad esempio se si fa affidamento su framework e server applicazioni esistenti. Una volta installata l'infrastruttura, posso diventare uno sviluppatore junior che scrive nuovi servizi per un'app Web e non so quasi NIENTE sulla concorrenza o sul parallelismo.
Andres F.

21

Dal 1970 a circa 2002 i processori hanno raddoppiato la velocità ogni 18 mesi circa. Quindi, come programmatore, tutto ciò che dovevi fare era aspettare e il tuo programma sarebbe andato più veloce. Il problema è che intorno al 2002 le regole sono cambiate. Ora non stanno producendo processori veloci più grandi, ma stanno trasformando processori più piccoli più lenti, ma li stanno mettendo in gruppi. Il computer su cui sto lavorando ora ha 4 core ed esistono chip con un massimo di 8 core (e 4 thread per core). Presto avremo chip con molti più core.

Quindi, se scrivi un programma che non è affatto concorrente, scoprirai che stai usando 1 core o thread, ma il resto della CPU è seduto lì senza fare nulla. Quindi se hai 16 core 1 eseguirà il tuo programma e gli altri 15 saranno seduti lì!

Il problema con la concorrenza è che non è deterministico. Il che significa che non sai esattamente in che ordine faranno le cose i diversi thread. Tradizionalmente i programmatori hanno cercato di risolverlo usando lock e simili. Questo ha portato a MOLTO dolore. Avere una qualche forma di stato mutevole a cui più di un thread può accedere liberamente è spesso una formula per il dolore e gli heisnebugs!

Di recente la tendenza è quella di passare a linguaggi funzionali che controllano strettamente lo stato mutevole. Esistono due modi di base in cui i linguaggi funzionali gestiscono la concorrenza. Il primo consiste nell'utilizzare il passaggio dei messaggi. Questo è mostrato al meglio da Erlang. In Erlang non esiste in generale uno stato condiviso tra i processi. Comunicano non condividendo la memoria ma i miei messaggi di passaggio. Questo dovrebbe avere senso per te come lo stiamo facendo proprio ora. Ti sto inviando queste informazioni inviandoti un messaggio, non da te ricordandole dal mio cervello! Passando al messaggio che passa la maggior parte dei bug di blocco semplicemente scompare. Inoltre, i messaggi possono essere passati sulla rete e all'interno di un nodo.

L'altro metodo è STM, che sta per Software Transcriptional Memory, presente in clojure e Haskell (e altri). Nella memoria STM è condivisa ma le modifiche possono essere apportate solo tramite una transazione. Dato che la gente del Database ha capito tutto questo negli anni '70, è abbastanza facile assicurarci di farlo bene.

In realtà ho semplificato un po ', Clojure e Haskell possono entrambi passare messaggi e Erlang può fare STM.

Disclaimer Sono l'autore di Programming Web Services con Erlang , che uscirà nelle versioni Early nelle prossime settimane.


1
@Zachary K: esistono approcci che fondono le lingue funzionali con le lingue native in modo che le parti ad alta intensità di calcolo siano implementate nella lingua madre ma forniscano interfacce che possono essere consumate da un server scritto in linguaggio funzionale?
rwong,

Non sicuro al 100%, ma sia Clojure che Scala esistono sulla JVM, quindi è qui che vorrei iniziare. Forse dai un'occhiata al framework Akka. Non l'ho usato ma ho ascoltato un discorso su Akka qualche tempo fa e sembra che potrebbe essere piuttosto bello. Per ora sto facendo Erlang e Javascript che mi stanno occupando la maggior parte del mio tempo!
Zaccaria K,

1
@rwong: .NET consente ai programmatori di usare C # o altri linguaggi non funzionali per alcune parti delle loro app e F #, un linguaggio funzionale, per altri.
Kevin,

5

Perché la concorrenza può esplodere in faccia quando te lo aspetti il ​​minimo ...


4
+10000000000000000000000000000000000000000

8
La concorrenza è la nuova Inquisizione spagnola [/ python] [come in: nessuno si aspetta ...]
ObscureRobot

1
@ObscureRobot due volte più divertente! (la spiegazione non era necessaria :-p)
fortran,

4

La prima regola della programmazione concorrente è "È difficile". La seconda regola della programmazione concorrente è "It. Is. Difficult" .. !!

Seriamente, ci sono due approcci comuni alla programmazione simultanea, il multi-threading e il multi-processing. L'elaborazione multipla è la più semplice da comprendere poiché significa semplicemente avere più istanze di un processo in esecuzione per eseguire un'attività. È abbastanza facile da fare su sistemi basati su Unix tramite chiamate a fork / join, ma non così facile su sistemi Windows.

Il multi-threading è probabilmente l'approccio che molte persone pensano quando parlano di concorrenza. Non è difficile avviare più thread all'interno di un'applicazione, ma il diavolo è nei dettagli. È necessario coordinare la condivisione dei dati tra thread (di solito utilizzando i blocchi) che può portare a deadlock o dati in uno stato non valido. Devi anche capire come comunicare tra i thread usando concetti come semafori, variabili condizionali ecc. Ecc.

Il vantaggio di tutto ciò è che una volta capito, è possibile utilizzare in modo più efficace l'hardware sottostante. In questi giorni è praticamente la norma per un processore avere più core. Utilizzando la programmazione concorrente puoi far funzionare questi core per te e la tua applicazione otterrà un miglioramento della velocità.

Lo svantaggio è che devi iniziare a pensare a come suddividere l'applicazione in piccole parti che possono essere eseguite su thread diversi. Questo è molto più difficile di quanto sembri. Inoltre, le soluzioni altamente concorrenti possono essere scomode per il test unitario poiché l'ordine di esecuzione è meno deterministico.

Oggigiorno la maggior parte delle lingue viene fornita con un'astrazione sulla maggior parte dei primitivi concorrenti per rendere la vita un po 'più semplice. Ad esempio, .NET 4 viene fornito con Task Parallel Library che semplifica la vita. Nella terra di Java hanno il pacchetto Concurrency .


1
Ottiene ordini di grandezza se scappi dalle serrature il più velocemente possibile. Usa STM o attori e tutto ciò che hai detto scompare. Ovviamente ciò significa spostarsi da Java a lingue come Scala, Erlang o Clojure. (anche se direi che anche questa è una buona cosa)
Zachary K

@Zachary: potrebbe essere una buona cosa, ma se lavori in un negozio .NET, ad esempio, non è pratico. STM potrebbe essere un'opzione in futuro, ma al momento non è un'opzione nei linguaggi tradizionali.
Sean,

Clojure funziona su .net e c'è F #. Scommetto che ci sono anche implementazioni STM per C #.
Zaccaria K,

3

Recentemente ho avuto un compito molto interessante da svolgere in cui il multiprocessing mi ha salvato. Fondamentalmente ho dovuto fare molte richieste a pochi server separati, gestendo quantità di dati molto ridotte, ma molte richieste.

Lavorando con PHP, ho fatto le cose alla vecchia maniera, e il miglior tempo che ho ottenuto dopo alcune ore di lavoro ha portato a ~ 120 secondi per eseguire un certo test (molte richieste + ritardo di rete + nessuna asincronizzazione)

Ma questo non era quasi sufficiente rispetto a quello di cui avevo bisogno, e dopo aver fallito miseramente con il multiprocessing dei PHP, sono passato a Python.

Dopo alcune ore, ho avuto uno script multiprocessing in esecuzione su Python che è stato eseguito in 20 secondi, e dopo un po 'di armeggi con i timeout e no. di thread da utilizzare, l'ho ottenuto fino a ~ 10 secondi .

Questo era per un sito Web scritto al 100% in PHP, ad eccezione di un singolo script Python a 100 righe. E tutto funziona perfettamente.

La mia conclusione sarebbe che, anche se non ti aiuterà quotidianamente, potresti incontrare situazioni in cui conoscere almeno le basi della programmazione concorrente ti aiuterà molto.

Buona fortuna e buona programmazione!

PS: Non sto cercando di colpire PHP, ma PHP semplicemente non era lo strumento giusto per il lavoro da svolgere.

PS2: Conoscere una nuova tecnologia o un nuovo modo di fare le cose può aprire la porta a un nuovo mondo di possibilità.


2

Se fai qualsiasi tipo di sviluppo web, la concorrenza entra in gioco, almeno con la maggior parte delle lingue. Ad esempio, utilizzo la primavera per lo sviluppo Web e ogni nuova richiesta arriva come propria discussione. Pertanto, se una richiesta finisce per accedere a un oggetto condiviso, in cui lo stato di una variabile può essere modificato, la concorrenza è un fattore determinante e deve essere presa in considerazione. In caso contrario, i dati possono essere modificati in modi imprevedibili e può causare il danneggiamento dei dati. Non è fondamentale conoscere tutti gli ultimi dettagli sulla concorrenza, ma imparare i pezzi alla volta è importante per comprendere meglio la programmazione delle app Web, se si lavora su app desktop, forse non è così importante a meno che non sia necessario eseguire più thread


-1

Scopri le informazioni dettagliate sui sistemi operativi. La lettura del codice sorgente di programmatori e driver di dispositivo sarà di aiuto; sono decisamente concorrenti.


2
Concorrenza per i programmatori di solito andare per la vostra propri programmi in esecuzione in più istanze.

Ho cercato di sottolineare che non puoi comunque scrivere il tuo programma simultaneo senza conoscere i dettagli dell'algoritmo di pianificazione del kernel del sistema operativo.
jj1bdx,

Perchè no? Se si utilizzano correttamente i meccanismi di blocco, l'algoritmo di pianificazione del sistema operativo non è importante.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.