Что такое Chords?
От: AngeL B. Россия  
Дата: 14.05.07 18:13
Оценка:
А кто ниб. может толком объяснить что такое Chords и с чем его едят?
А то из всех снипетов я так и не понял для чего он нужен и вообще как с ним обсчаться.
Re: Что такое Chords?
От: ie Россия http://ziez.blogspot.com/
Дата: 16.05.07 06:28
Оценка: 46 (3)
Здравствуйте, AngeL B., Вы писали:

AB>А кто ниб. может толком объяснить что такое Chords и с чем его едят?

AB>А то из всех снипетов я так и не понял для чего он нужен и вообще как с ним обсчаться.

Смотри. У тебя есть асинхронный метод, если метод значения не возвращает, то его запускают асинхронно и зачастую забывают про него. А если возвращает значение, то как правило, это значение понадобится в каком-то месте программы. Т.е. у нас есть 2 типа методов:
1. асинхронные методы;
2. синхронные методы, предназначенные для доставки результатов работы наших асинхронных методов в синхронные.
Для связки этих методов вводятся chords (собственно, так и переводится в данном контексте — связка).

Итак, для чего же они нужны... Например, есть 3 потока производящие некоторые вычиления. Есть 4-ый поток, который на базе результатов работы 3-х первых, продолжает вычисления. И есть главный поток, которому в какой-то момент пригодятся результаты работы 4-ого потока.

using System.Console;
using Nemerle.Concurrency;

class A
{
    [ChordMember] public CM1(i : int) : void;
    [ChordMember] public CM2(d : double) : void;
    [ChordMember] public CM3(s : string) : void;
    public IntermediateRezult : string
    {
        get chord 
        {
            // пока все 3 результата не будут готовы, ничего не делаем
            // как только результаты есть начинаем вычисления
            | [CM1, CM2, CM3] =>
                // типа длинные-длинные вычисления
                $"$s - $(i*d)";
        }
    }

    [ChordMember] public CM4(s : string) : void;
    public Rezult : string
    {
        get chord { | CM4 => s }
    }
}

def a = A();

async 
{
    WriteLine("thread #4 started...");
    WriteLine("thread #4 is waiting for intermediate rezult...");
    def x = a.IntermediateRezult;
    WriteLine("thread #4 is got intermediate rezult...");
    a.CM4(x);
    WriteLine("thread #4 finished...");
}

async 
{
    WriteLine("thread #1 started...");
    a.CM1(10); 
    WriteLine("thread #1 finished...");
}

async
{
    WriteLine("thread #2 started...");
    a.CM2(91.23);
    WriteLine("thread #2 finished...");
}

async
{
    WriteLine("thread #3 started...");
    a.CM3("rezult");
    WriteLine("thread #3 finished...");
}

// главный поток в этом месте нуждается в результате работы 4-ого потока
// если результата еще нет, ждем его
WriteLine(a.Rezult);


А вот, например, задачка про хамелионов, с использованием chords, приводимая тут — Re[3]: Так в чем же принципиальные отличия ФП от ИП?
Автор: Lazy Cjow Rhrr
Дата: 24.04.07

#pragma indent

using System.Console;
using System.Threading;
using Nemerle.Concurrency;

variant Color { | Red | Blue | Yellow | Faded }

class MeetingPlace [T]

    public this ()
        Empty ()

    [ChordMember] Empty () : void

    [ChordMember] Contains (value : T) : void

    public Store : T
        set chord { | Empty => Contains (value) }
        get chord { | Contains => Empty (); value }


mutable n = 1000
def sync = object()
def mp1 = MeetingPlace()
def mp2 = MeetingPlace()
def sem = Semaphore(2, 2)

foreach (c in [Color.Red(), Color.Blue(), Color.Yellow(), Color.Faded()])
    async
        mutable color = c
        mutable meets = 0
        def f()
            match (color)
                | Faded => ()
                | _ => 
                    _ = sem.WaitOne()

                    if (n > 0)
                        def change(mp1, mp2)
                            mp1.Store = color
                            color = mp2.Store

                        if (Monitor.TryEnter(sync))
                            change(mp2, mp1)
                            n--
                            Monitor.Exit(sync)
                        else
                            change(mp1, mp2)

                        meets++
                    else
                        color = Color.Faded()

                    _ = sem.Release()
                    f()
        f()
        WriteLine($"meets :: $meets")
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[2]: Что такое Chords?
От: AngeL B. Россия  
Дата: 16.05.07 09:06
Оценка:
Здравствуйте, ie, Вы писали:

ie>async

ie>{
ie> WriteLine("thread #1 started...");
ie> a.CM1(10);
ie> WriteLine("thread #1 finished...");
ie>}

А вызов a.CM1(10); надо понимать и есть как бы сообщение, что результат работы данного асинхронного кода — число 10.
Нечто похожее на работу с блоками (blocks) и сохранение их результата только в асинхронном режиме и с возможностью дожидаться завершения одного или нескольких действий.
Так?
Re[3]: Что такое Chords?
От: ie Россия http://ziez.blogspot.com/
Дата: 17.05.07 03:01
Оценка:
Здравствуйте, AngeL B., Вы писали:

ie>>async

ie>>{
ie>> WriteLine("thread #1 started...");
ie>> a.CM1(10);
ie>> WriteLine("thread #1 finished...");
ie>>}

AB>А вызов a.CM1(10); надо понимать и есть как бы сообщение, что результат работы данного асинхронного кода — число 10.


Тут надо понимать, что этот вызов никогда не возвращает значение. Это действительно декларация результатов работы, а не вызов с целью произвести вычиселния.
Вообще говоря, для понимания устройства chords, достаточно поглядеть скомпилированный код рефлектором. Ну и макрос, неплохо бы, поизучать.

AB>Нечто похожее на работу с блоками (blocks) и сохранение их результата только в асинхронном режиме и с возможностью дожидаться завершения одного или нескольких действий.

AB>Так?

Ну, честно говоря, мне таких аналогий в голову не приходит. Я бы вообще не стал бы пытаться проводить параллель ни с blocks, ни с чем либо другим. Chords — это просто элемент асинхронного программирования.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[4]: Что такое Chords?
От: AngeL B. Россия  
Дата: 17.05.07 06:44
Оценка:
Здравствуйте, ie, Вы писали:

ie> Тут надо понимать, что этот вызов никогда не возвращает значение. Это действительно декларация результатов работы, а не вызов с целью произвести вычиселния.

это понятно

ie>Ну, честно говоря, мне таких аналогий в голову не приходит. Я бы вообще не стал бы пытаться проводить параллель ни с blocks, ни с чем либо другим. Chords — это просто элемент асинхронного программирования.


О, я, кажется, понял на что это действительно похоже. На события (Event) только параметризованные и с автоматическим сбросом. А get chord на ожидание набора событий с последующим действием. Типа, если случился этот набор событий, то сделать то-то, если другой набор, то другое то-то

Пошел изучать макрос.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.