Am 29.10.2013 um 02:08 schrieb David T. Lewis <lewis@mail.msen.com>:
I have some experience with this, not related to Smalltalk but maybe still relevant. I have worked with systems that were designed around networked message passing, implemented on platforms like MS-DOS with time slicing kernels, Series I, OS/2, etc. These systems were designed to operate with asynchronous message passing protocols. The asynchronous designs were intended to support primitive OS environments, including MS-DOS with software interrupts for multitasking.
These are production-critical manufacturing applications, and in the course of modernizing them I have reimplemented the network protocols in Java and moved them to new computing platforms. Along the way I have found that the asynchronous designs could always be replaced by bidirectional send-receive transactions running in the context of a thread or process. Even the systems that appeared to be most complex have turned out to work perfectly well when modeled as synchronous send-receive transactions on a bidirectional communication channel. The software is much simpler to understand and debug when structured in this manner.
My conclusion is that designing around asynchronous, loosely coupled channels sounds like a good idea, but in practice it leads to unnecessary complexity, and to systems that are difficult to debug and support.
I agree. That was the reason for me to look out for a simpler approach. At least for testing. Can you elaborate on the âbidirectional send-receive transactionâ. Iâm not sure I understand what happens there. I explained my case a bit more in my response to Igor. thanks, Norbert
$0.02
Dave
On Tue, Oct 29, 2013 at 01:19:17AM +0100, Igor Stasenko wrote:
Maybe i'm off track, but here my thoughts:
- one big misconception (and most problems which arising from it), that people tend to use a bidirectional communication models instead of unidirectional. In bidirectional you tend to think as if you using same channel for sending and receiving data. The truth is, that it is two unidirectional channels, wired in the way so they look like single bidirectional channel.
And what it means, that coupling sending and receiving activities in a single thread is wrong: - you should not wait for data only if you sent something - you should not expect that activity from other end is possible only after you _send_ something.
If you treat connection as two unidirectional, loosely coupled channels, instead of single bidirectional one, you will find that in such setup you don't have many problems.
You should definitely go for (2), e.g. you should decouple a transport/communication layer from your program/logic flow: if some process wants to send data and block until some response to that message arrived, you should do so. You can simply put that process on semaphore, and adding it to the list of 'awaiting answer' processes in your scheduler which runs in separate process to handle incoming data. Then you can have different strategies, what to do if a) data seems taking too long to arrive (signal timeout) b) connection lost c) etc..
ohh.. with smalltalk it is so easy to operate with those things (the fact the VM is green-threaded doesn't changes much).
On 28 October 2013 23:52, Norbert Hartl <norbert@hartl.name> wrote:
Am 28.10.2013 um 23:50 schrieb Norbert Hartl <norbert@hartl.name>:
Are there any approaches to simulate coroutines in a single thread environment or approaches to deal with multiple processes within one process?
That should have been
Are there any approaches to simulate coroutines in a single thread environment or approaches to deal with multiple processes within one test?
Norbert
-- Best regards, Igor Stasenko.