दिलचस्प समस्या - print
कथन के भीतर होने वाली सभी चीजों पर विचार करते हुए, softspace
विशेषता की सेटिंग और जांच सहित, इसे "थ्रेडसेफ" (अर्थात्: वास्तव में: थ्रेड जो केवल प्रिंटिंग करता है "मानक आउटपुट का नियंत्रण "जब यह एक नई लाइन प्रिंट कर रहा है, तो एक और थ्रेड के लिए, ताकि आउटपुट की प्रत्येक पंक्ति को एक थ्रेड से आने की गारंटी दी जा सके) एक चुनौती थी (वास्तविक थ्रेड सुरक्षा के लिए सामान्य आसान दृष्टिकोण - एक अलग थ्रेड को प्रस्तुत करना विशेष रूप से "स्वयं" और sys.stdout
को संभालें, क्यूई के माध्यम से इसके साथ संवाद करें। क्यूयू - यह सब उपयोगी नहीं है, क्योंकि समस्या थ्रेड सुरक्षा [[सादा print
के साथ भी कोई जोखिम नहीं है एफ क्रैशिंग और मानक आउटपुट पर समाप्त होने वाले पात्र बिल्कुल वही हैं जो मुद्रित होते हैं]] लेकिन संचालन की एक विस्तृत श्रृंखला के लिए धागे के बीच पारस्परिक बहिष्कार की आवश्यकता)।
तो, मुझे लगता है कि मैं इसे बनाया ...:
import random
import sys
import thread
import threading
import time
def wait():
time.sleep(random.random())
return 'W'
def targ():
for n in range(8):
wait()
print 'Thr', wait(), thread.get_ident(), wait(), 'at', wait(), n
tls = threading.local()
class ThreadSafeFile(object):
def __init__(self, f):
self.f = f
self.lock = threading.RLock()
self.nesting = 0
def _getlock(self):
self.lock.acquire()
self.nesting += 1
def _droplock(self):
nesting = self.nesting
self.nesting = 0
for i in range(nesting):
self.lock.release()
def __getattr__(self, name):
if name == 'softspace':
return tls.softspace
else:
raise AttributeError(name)
def __setattr__(self, name, value):
if name == 'softspace':
tls.softspace = value
else:
return object.__setattr__(self, name, value)
def write(self, data):
self._getlock()
self.f.write(data)
if data == '\n':
self._droplock()
# comment the following statement out to get guaranteed chaos;-)
sys.stdout = ThreadSafeFile(sys.stdout)
thrs = []
for i in range(8):
thrs.append(threading.Thread(target=targ))
print 'Starting'
for t in thrs:
t.start()
for t in thrs:
t.join()
print 'Done'
wait
के लिए कॉल गारंटी इस पारस्परिक अपवर्जन गारंटी के अभाव में अस्त व्यस्त मिश्रित निर्गम (टिप्पणी जिस कारण से) करना है। रैपिंग के साथ, यानी उपर्युक्त कोड ठीक उसी तरह दिखता है, और (कम से कम) पायथन 2.5 और ऊपर (मुझे विश्वास है कि यह पिछले संस्करणों में भी चलाया जा सकता है, लेकिन मेरे पास जांचने के लिए आसानी से हाथ नहीं है) उत्पादन होता है:
Thr W -1340583936 W at W 0
Thr W -1340051456 W at W 0
Thr W -1338986496 W at W 0
Thr W -1341116416 W at W 0
Thr W -1337921536 W at W 0
Thr W -1341648896 W at W 0
Thr W -1338454016 W at W 0
Thr W -1339518976 W at W 0
Thr W -1340583936 W at W 1
Thr W -1340051456 W at W 1
Thr W -1338986496 W at W 1
...more of the same...
"क्रमबद्धता" efect (जिससे धागे प्रकट करने के लिए "अच्छी तरह से राउंड-रोबिन" के रूप में ऊपर) इस तथ्य का एक पक्ष प्रभाव है कि धागा है कि हो जाता है वर्तमान में मुद्रण हो रहा है एक दूसरों की तुलना में गंभीरता से धीमा है (वे सभी इंतजार कर रहे हैं! -)। wait
में time.sleep
बाहर टिप्पणी करते हुए उत्पादन के बजाय है
Thr W -1341648896 W at W 0
Thr W -1341116416 W at W 0
Thr W -1341648896 W at W 1
Thr W -1340583936 W at W 0
Thr W -1340051456 W at W 0
Thr W -1341116416 W at W 1
Thr W -1341116416 W at W 2
Thr W -1338986496 W at W 0
...more of the same...
अर्थात एक और अधिक विशिष्ट "बहु उत्पादन" ... गारंटी नहीं है कि उत्पादन में प्रत्येक पंक्ति एक ही धागे से पूरी तरह से आता है के लिए छोड़कर।
बेशक, एक थ्रेड जो करता है, उदा।, print 'ciao',
मानक आउटपुट के "स्वामित्व" को तब तक रखेगा जब तक कि यह अंततः पीछे की ओर कॉमा के बिना प्रिंट नहीं करता है, और प्रिंट करने के इच्छुक अन्य थ्रेड थोड़ी देर के लिए सो सकते हैं (कैसे कोई गारंटी दे सकता है कि आउटपुट में प्रत्येक पंक्ति आती है एक धागा? ठीक है, एक आर्किटेक्चर मानक आउटपुट में उन्हें वास्तव में लिखने के बजाय थ्रेड स्थानीय स्टोरेज में आंशिक रेखाएं जमा करना होगा, और केवल \n
की प्राप्ति पर लेखन करना होगा ... softspace
सेटिंग्स के साथ ठीक से इंटरलीव करने के लिए नाज़ुक, मुझे डर है , लेकिन शायद व्यवहार्य)।
उन लेखों पायथन 3. के बारे में हैं कहाँ लेख करते हुए कहा कि 'पायथन 2.x में print' हैं धागा सुरक्षित नहीं है? –
इग्नासिओ: मैंने इसे स्वयं देखा है :-) स्टडआउट पर प्रिंट करने वाले कुछ धागे को कताई करने का प्रयास करें। लाइनों को सब गड़बड़ कर दिया जाएगा। – knorv