Je l'interpréterais d'une autre manière. Ce n'est pas que fils sont mauvais, c'est que effets secondaires sont diaboliques dans un contexte multithread (ce qui est beaucoup moins accrocheur à dire).
Un effet secondaire dans ce contexte est quelque chose qui affecte l'état partagé par plus d'un thread, qu'il soit global ou simplement partagé. J'ai récemment écrit un revue de Spring Batch et l'un des extraits de code utilisé est :
private static Map<Long, JobExecution> executionsById = TransactionAwareProxyFactory.createTransactionalMap();
private static long currentId = 0;
public void saveJobExecution(JobExecution jobExecution) {
Assert.isTrue(jobExecution.getId() == null);
Long newId = currentId++;
jobExecution.setId(newId);
jobExecution.incrementVersion();
executionsById.put(newId, copy(jobExecution));
}
Maintenant, il y a au moins trois des problèmes sérieux de threading en moins de 10 lignes de code ici. Un exemple d'effet secondaire dans ce contexte serait la mise à jour de la variable statique currentId.
La programmation fonctionnelle (Haskell, Scheme, Ocaml, Lisp, etc.) tend à privilégier les fonctions "pures". Une fonction pure est une fonction sans effets secondaires. De nombreux langages impératifs (par exemple Java, C#) encouragent également l'utilisation d'objets immuables (un objet immuable est un objet dont l'état ne peut pas changer une fois créé).
La raison (ou du moins l'effet) de ces deux choses est largement la même : elles rendent le code multithreading beaucoup plus facile. Une fonction pure est par définition threadsafe. Un objet immuable est, par définition, threadsafe.
L'avantage des processus est qu'il y a moins d'état partagé (en général). Dans la programmation C UNIX traditionnelle, l'exécution d'un fork() pour créer un nouveau processus entraînerait le partage de l'état du processus, ce qui était utilisé comme moyen de communication interprocessus (IPC), mais cet état est généralement remplacé (avec exec()) par autre chose.
Mais les fils sont beaucoup Ils sont moins chers à créer et à détruire et nécessitent moins de ressources système (en fait, le système d'exploitation lui-même peut ne pas avoir de notion de threads, mais vous pouvez quand même créer des programmes multithreads). Ces programmes sont appelés fils verts .