The main difference is that goroutines do blocking takes from channels whereas actors receive asynchronous events. This means that actors have to deal with all the situations in asynchronous programming that are inherently difficult to deal with (inherently means there is no general way to solve this and never will be).
The approach with blocking takes as in CSP and in Go runs into a problem when a thread blocked by an empty channel is lost for the application. Somehen then operationg system has no memory left to create new threads. This is being dealt with by having so called green threads (called goroutines in Go). Green threads have a reduced context and therefore consume less memory. On a machine with 4 GB RAM you can create about 2000 OS threads but about 80.000 goroutines (I once tried it out). So in Go you don't run into the problem that many empty channels with threads being blocked by them till they receive input can make the application go out of threads. Actors have an advantage when used for distributed systems. If two actors on different boxes communicate with each other it is not a problem to make communication work without data loss through the principle of supervision. Supervision is the idea Joe Armstrong (the creator of Erlang) described in his PhD thesis. If two actors communicating with each other, realize something in the communication must have gone wrong (timeout waiting for ack, etc.), a third supervisory actor is informed which resets both actors who then restart from some safe point. There are hierarchies of supervisory actors to deal with the problem that also a superviory actor may hang or be subject to data loss. Also, actors are served by normal threads (making use of thread pools to keep the number of memory intensive threads low). These normal threads do not have a reduced context, but a full one. This means that the information is present where some preemption took place where the thread needs to continue when resumed after suspension. Not so for green threads, because of their context being reduced, they are not pre-emptive. The developer in some situations needs to know that the current green thread/goroutine needs to yield for things to continue. Channels in Go or CSP in general, on the contrary, rely on data exchange between channels to be free from any data loss. Otherwise the application may sit forever on some empty channel. This is no problem for channels inside the same instance of some program, but it is a problem in distributed systems that have to deal with communication through networks being unreliable. In general with CSP-style concurrency it is much easier to get process synchronization right. If there is a problem, it is much easier to spot it and also to fix it. If have spent years of reproducing race conditions and deadlocks and fixing them with "traditional" programming languages without CSP. Saying that CSP makes concurrent programming much easier is something I can confirm from real-world experience. But they don't work well in distributed systems and when pre-emption is a necessity (shut down nuclear power plant when temperature threshold is exceeded here and now). There is also CSP in the working for the JVM with Coroutines in Kotlin and project Loom for the JVM. The advantes of CSP for server-side programming and concurrency in general have become apparent also to other people ... ;-) Am Sonntag, 4. März 2018 18:00:54 UTC+1 schrieb Anto Aravinth: > > Hello All, > > I'm new to golang and trying to understand the difference between channels > and actors. From my knowledge: > > 1. Golang support channels, which is concurrently safe > 2. Channels can be shared across goroutines that are running. (very much > similar to messages) > > Actors: > 1. They are based on messages. > 2. Messages are immutable by nature. > 3. Actors work based on messages, concurrently. > > I find actors and channels much similar, may be I'm wrong here. Any help > would be really good. > > Thanks, > Anto; > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.