سؤال

لدي بعض الأشياء المكتوبة في C # التي تنفذ التعليمات البرمجية المتزامنة، مما يجعل الاستخدام المكثف للمكتبة الموازية المهمة (المهمة والسلاسل المستقلة المستقبلية).

أنا الآن أقوم بتنفيذ هذا إلى F # وأنا أحاول معرفة إيجابيات وسلبيات استخدام W # Async Worksflows مقابل البنيات في TPL. أنا مئز نحو TPL، لكنني أعتقد أنه يمكن القيام به في كلتا الحالتين.

هل لدى أي شخص نصائح وحكمة حول كتابة البرامج المتزامنة في F # للمشاركة؟

هل كانت مفيدة؟

المحلول

اسم إلى حد كبير يلخص الفرق: غير متزامن البرمجة مقابل موازى برمجة. ولكن في F # يمكنك مزج ومطابقة.

F # سير العمل غير المتزامن

F # سير العمل ASYNC مفيدة عندما تريد تنفيذ التعليمات البرمجية بشكل غير متزامن، والتي بدأت مهمة ولا تنتظر حولها للنتيجة النهائية. الاستخدام الأكثر شيوعا لهذه هي عمليات IO. وجود مؤشر الترابط الخاص بك الجلوس هناك في حلقة الخمول في انتظار القرص الثابت الخاص بك لإنهاء موارد النفايات.

إذا بدأت عملية الكتابة بشكل غير متزامن، فيمكنك تعليق الخيط وإحكم عليه لاحقا من خلال مقاطعة الأجهزة.

مكتبة المهمة الموازية

المكتبة المتوازية المهمة في .NET 4.0 ملخصات فكرة مهمة - مثل فك تشفير MP3، أو قراءة بعض النتائج من قاعدة بيانات. في هذه الحالات، تريد فعلا نتيجة الحساب وفي وقت ما في وقت لاحق في وقت لاحق ينتظر نتيجة العملية. (عن طريق الوصول إلى .result الخاصية.)

يمكنك بسهولة مزج ومطابقة هذه المفاهيم. مثل القيام بكل عمليات IO الخاصة بك في كائن TPL المهام. إلى المبرمج، قمت بإزالة الحاجة إلى "التعامل مع" هذا الموضوع الإضافي، ولكن تحت الأغطية تضيع الموارد.

مثل Wise يمكنك إنشاء سلسلة من سير العمل F # Async وتشغيلها بالتوازي (ASYNC.PARALLEL) ولكن عليك أن تنتظر النتيجة النهائية (Async.RunsySonsly). هذا يحررك من الحاجة إلى بدء تشغيل جميع المهام بشكل صريح، ولكن في الحقيقة تقوم فقط بأداء الحساب بالتوازي.

في تجربتي، أجد أن TPL أكثر فائدة لأنه عادة ما أريد تنفيذ عمليات N بالتوازي. ومع ذلك، فإن سير عمل F # ASYNC مثالي عندما يكون هناك شيء يحدث "وراء الكواليس" مثل وكيل تفاعلي أو نوع صندوق البريد. (ترسل رسالة رسالة، فإنه يعالج ذلك ويرسله مرة أخرى.)

امل ان يساعد.

نصائح أخرى

في 4.0 أود أن أقول:

  • إذا كانت وظيفتك متتابعة، فاستخدم سير عمل ASYNC. أنها ببساطة قراءة أفضل.
  • استخدم TPL لكل شيء آخر.

من الممكن أيضا مزج ومطابقة. لقد أضافوا الدعم لتشغيل سير العمل كمهمة وخلق المهام التي تتبع نمط بدء التشغيل / نهاية ASYNC باستخدام deskfactory.fromasync., ، ما يعادل TPL من async.frombegegenend. أو Async.BuildPrimitive.

let func() =
    let file = File.OpenRead("foo")
    let buffer = Array.zeroCreate 1024
    let task1 = Task.Factory.FromAsync(file.BeginRead(buffer, 0, buffer.Length, null, null), file.EndRead)
    task1.Start()

    let task2 = Async.StartAsTask(file.AsyncRead(1024))
    printfn "%d" task2.Result.Length

تجدر الإشارة أيضا إلى أن وقت تشغيل Workworows ASYNC و TPL سيقوم بإنشاء نواة إضافية بدائية (حدث) واستخدامها WaitFormulipleObjects. لتتبع إكمال الإدخال / الإخراج، بدلا من استخدام منافذ الإنجاز والاتصالات. هذا غير مرغوب فيه في بعض التطبيقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top