2009-12-10 14 views
8

क्या यह सुनिश्चित करने का कोई तरीका है कि एक goroutine केवल एक विशिष्ट ओएस थ्रेड में ही चलाएगा? उदाहरण के लिए, जब जीयूआई ऑपरेशन जीयूआई थ्रेड में चलाना चाहिए, लेकिन जीयूआई कोड चलाने वाले कई गोरोटाइन हो सकते हैं।उसी थ्रेड में goroutines को मजबूर करना

GOMAXPROCS(1) तकनीकी रूप से नौकरी करता है, लेकिन यह बहुप्रचार के उद्देश्य को हरा देता है।

LockOSThread() भी काम करता है, लेकिन यह किसी अन्य गोरौटाइन को उस धागे में भी चलने से रोकता है।

क्या ऐसा करने का कोई तरीका है, या एक ही थ्रेड की आवश्यकता वाले सभी थ्रेडों को भी जरूरी है?

उत्तर

8

मेरे ज्ञान का सबसे अच्छा, वर्तमान में नहीं। मुझे लगता है कि ऐसा करने के लिए 'जाने-माने' तरीका एक गोरौटाइन लिखना होगा जो जीयूआई थ्रेड में चलता है और चैनल पर भेजे गए अन्य गोरोटाइन से सेवाओं के अनुरोध करता है। उदाहरण के लिए, आप इसे ऐसे चैनल से पढ़ सकते हैं जो फ़ंक्शन पॉइंटर्स स्वीकार करता है, और उन कार्यों को निष्पादित करता है।

+2

-1 आपका उत्तर "क्या यह सुनिश्चित करने का कोई तरीका है कि एक goroutine केवल एक विशिष्ट ओएस थ्रेड में ही चलाएगा?" क्या "एक गोरौटाइन लिखना है जो जीयूआई थ्रेड में चलता है"? यह मेरी मदद कैसे कर सकता है? –

+3

आपने पहले ही बताया है कि लॉकऑस्टहा्रेड आपको गोरौटाइन को एक विशिष्ट थ्रेड पर लॉक करने देता है। बस जीयूआई धागे के लिए ऐसा करते हैं। –

+0

जो आपको गोरौटाइन को * वर्तमान * थ्रेड पर लॉक करने की अनुमति देता है, न कि मनमाना विशिष्ट थ्रेड के लिए। – robx

3

आप ऐसा क्यों करना चाहते हैं? मेरा मानना ​​है कि runtime.LockOSThread() आवश्यक है यदि आप सी कोड से बाइबिल बाध्यकारी बना रहे हैं जो थ्रेड-लोकल स्टोरेज का उपयोग करता है। अन्यथा, शेड्यूलर को आपके लिए goroutines मल्टीप्लेक्स दें।

और ध्यान दें कि runtime.LockOSThread() केवल अन्य goroutines को उस थ्रेड में चलने से रोकता है जब तक कि आप runtime.UnlockOSThread() पर कॉल न करें।

+0

1) चूंकि ओपी ने बताया कि जीयूआई कोड को समवर्तीता के लिए गोरोटाइन की आवश्यकता है, लेकिन हो सकता है कि सीपीयू संसाधनों की प्राथमिकता को अन्य कोड के साथ साझा न करें जो उच्च थ्रूपुट की आवश्यकता हो, हालांकि यह अवांछित हो सकता है; 2) [स्पॉन्टेड गोरोटाइन्स को प्रतिबंधित करने की क्षमता] (https://stackoverflow.com/questions/30646391/does-runtime-lockosthread-allow-child-goroutines-to-run-in-same-os-thread) उसी पर ओएस थ्रेड [concurrency के लॉकलेस डिजाइन में सहायता कर सकते हैं] (https://github.com/keean/zenscript/issues/17#issuecomment-359338947)। –

संबंधित मुद्दे