8

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

subprocess.Popen(... , stdout=...) 

मुद्रण के IPython बराबर प्रक्रिया के अंदर करने के लिए subprocesses के प्रिंट उत्पादन अनुप्रेषित करने के लिए देख रहा हूँ काम नहीं करता:

rc = Client() 
dview = rc() 
def ff(x): 
    print(x) 
    return x**2 
sync = dview.map_sync(ff,[1,2,3,4]) 
print('sync res=%s'%repr(sync)) 
async = dview.map_async(ff,[1,2,3,4]) 
print('async res=%s'%repr(async)) 
print(async.display_outputs()) 

sync res=[1, 4, 9, 16] 
async res=[1, 4, 9, 16] 

तो गणना सही ढंग से कार्यान्वित दिखाए, लेकिन समारोह एफएफ में प्रिंट बयान मुद्रित कभी नहीं है, यहां तक ​​कि नहीं जब सभी प्रक्रियाओं returne है घ। मैं क्या गलत कर रहा हूँ? मैं काम करने के लिए "प्रिंट" कैसे प्राप्त करूं?

उत्तर

9

यह वास्तव में अपेक्षा की अपेक्षा से subprocess.Popen(... , stdout=PIPE) के समान है। बस Popen ऑब्जेक्ट की तरह stdout विशेषता है, जिसे आप उपप्रोसेस, के stdout को देखने के लिए पढ़ सकते हैं, एक AsyncResult में stdout विशेषता है जिसमें इंजन से प्राप्त स्टडआउट होता है। यह AsyncResult.stdout में भिन्न होता है तारों की सूची, जहां सूची में प्रत्येक आइटम स्ट्रिंग के रूप में एक इंजन का stdout है।

तो, बाहर शुरू करने के लिए:

rc = parallel.Client() 
dview = rc[:] 
def ff(x): 
    print(x) 
    return x**2 
sync = dview.map_sync(ff,[1,2,3,4]) 
print('sync res=%r' % sync) 
async = dview.map_async(ff,[1,2,3,4]) 
print('async res=%r' % async) 
async.get() 

देता

sync res=[1, 4, 9, 16] 
async res=<AsyncMapResult: ff> 

हम तार के AsyncResult.stdout सूची देख सकते हैं:

print(async.stdout) 
['1\n2\n', '3\n4\n'] 

हम async परिणाम की stdout देख सकते हैं :

print('async output:') 
async.display_outputs() 

प्रिंट जो:

async output: 
[stdout:0] 
1 
2 
[stdout:1] 
3 
4 

और here is a notebook इस सब के साथ प्रदर्शन किया।

कुछ बातों का ध्यान रखना, अपने प्रश्न के आधार पर:

  1. आप, AsyncResult समाप्त होने की प्रतीक्षा करने के लिए है से पहले आउटपुट तैयार हैं (async.get())
  2. display_outputs() कुछ भी वापस नहीं करता है - यह वास्तव में करता है प्रिंटिंग/खुद को प्रदर्शित करना, इसलिए print(async.display_outputs()) समझ में नहीं आता है।
+0

बहुत उपयोगी उत्तर। गणना के दौरान stdout प्रिंटआउट देखने का कोई तरीका है? – spencerlyon2

+0

हां - प्रिंट स्टेटमेंट्स के लिए, आउटपुट आंशिक होने पर भी, asyncresult.stdout: print out' में बाहर निकलें, जिसे आप किसी भी समय कर सकते हैं। – minrk

+1

क्या स्रोत कोड तक पहुंच के बिना इसे प्राप्त करने का कोई तरीका है? एक पुस्तकालय है कि मैं थ्रेड में प्रिंट प्रिंट संदेशों का उपयोग कर रहा हूं, और मैं इसे प्रिंट करने के लिए प्रिंट करना चाहता हूं। क्या मुझे ऐसा करने के लिए आईपीथॉन कक्षाओं में से एक का विस्तार करना होगा? – hgcrpd

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