Здравствуйте, 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>>
А кто ниб. может толком объяснить что такое Chords и с чем его едят?
А то из всех снипетов я так и не понял для чего он нужен и вообще как с ним обсчаться.
Здравствуйте, 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>>
Здравствуйте, ie, Вы писали:
ie> Тут надо понимать, что этот вызов никогда не возвращает значение. Это действительно декларация результатов работы, а не вызов с целью произвести вычиселния.
это понятно
ie>Ну, честно говоря, мне таких аналогий в голову не приходит. Я бы вообще не стал бы пытаться проводить параллель ни с blocks, ни с чем либо другим. Chords — это просто элемент асинхронного программирования.
О, я, кажется, понял на что это действительно похоже. На события (Event) только параметризованные и с автоматическим сбросом. А get chord на ожидание набора событий с последующим действием. Типа, если случился этот набор событий, то сделать то-то, если другой набор, то другое то-то
Пошел изучать макрос.