هل يمكنك اكتشاف عدد المواضيع التي سيخلقها عدد معين من Goroutines؟

StackOverflow https://stackoverflow.com/questions/1714136

  •  19-09-2019
  •  | 
  •  

سؤال

أفهم أن Goroutines تعددن على مؤشرات ترابط OS متعددة، لذلك إذا كان ينبغي على المرء أن يحظر، مثل انتظار I / O، يستمر البعض الآخر في الركض. ولكن هل هناك أي طريقة لمعرفة وقت طويل كم عدد المواضيع التي أردت أن تفرخ إذا كنت في إنشاء goroutines n؟

على سبيل المثال، إذا استدعينا الوظيفة أدناه، فهل نعرف عدد مؤشرات ترابط النظام (أو الحد الأقصى لعدد) مؤشر ترابط النظام ل Goroutines N

type Vector []float64

// Apply the operation to n elements of v starting at i.
func (v Vector) DoSome(i, n int, u Vector, c chan int) {
    for ; i < n; i++ {
        v[i] += u.Op(v[i])
    }
    c <- 1;    // signal that this piece is done
}
هل كانت مفيدة؟

المحلول

وفقا ل Go Process Slides PDF (اليوم 3):

... إذا كنت تريد توازي مستوى المستخدم، يجب عليك تعيين $GOMAXPROCS أو أتصل runtime.GOMAXPROCS(n). GOMAXPROCS يحكي جدولة وقت التشغيل كم عدد Goroutines غير المحظور غير المحظور لتشغيلها مرة واحدة.

مرتكز على هذه المدونة post., ، أيضا، يبدو الأمر وضع متغير البيئة GOMAXPROCS يتيح لك إصلاح عدد المواضيع. لست متأكدا من كيفية الحصول على العدد الافتراضي من مؤشرات الترابط، سيتم إدارة وقت التشغيل إذا لم تحدد هذه القيمة، ولكن

هذه المدونة post. يبدو أنه يعني أنه إذا لم تقم بتعيين متغير البيئة، فلن تستخدم وقت التشغيل فقط كور واحد (يفترض أنه يستخدم عملية واحدة فقط.)

نصائح أخرى

يمكن لكل Goroutine استخدام مؤشر ترابط واحد كحد أقصى في وقت واحد. ما إذا كان يستخدم مؤشر ترابط أو لا يعتمد على ما يفعله. تحدد قيمة GoMaxProcs عدد المواضيع التي يمكن استخدامها من قبل كود الذهاب الجري بحرية - بمعنى آخر، الحد الأقصى لمستوى توازي.

ومع ذلك، يمكن استخدام المزيد من المواضيع، حتى مع GomaxProcs = 1، عند حظر Goroutines مباشرة على مكالمات النظام أو المكالمات إلى C.

العمليات التالية تفعل ليس تسبب goroutine لاستخدام مؤشر ترابط عند حظره:

  • عمليات القناة
  • عمليات الشبكة
  • نائم
  • جميع البدائيات في مزامنة صفقة

هذا يعني، على سبيل المثال، أنه إذا كان لديك العديد من Goroutines التي تفتح / dev / ttyxx وحظرها على القراءة، فسوف تستخدم مؤشر ترابط لكل واحد. ينطبق الشيء نفسه إذا كنت تقوم بتنفيذ حمولة من العمليات وانتظار الخروج منها للخروج.

حاليا، سيقوم GCCGO بإنشاء مؤشر ترابط واحد لكل Goroutine.

أنا لا أعرف حوالي 6G.

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