8

Tôi mới dùng IPython và muốn in kết quả trung gian thành stdout trong khi chạy các chức năng cụm song song IPython. (Tôi biết rằng với nhiều quy trình, điều này có thể làm xáo trộn đầu ra, nhưng điều đó là tốt - nó chỉ để thử nghiệm/gỡ lỗi, và các tiến trình tôi muốn chạy đủ dài đến mức không thể xảy ra xung đột.) Tôi đã kiểm tra tài liệu cho IPython nhưng không thể tìm thấy một ví dụ mà các chức năng song song in. Về cơ bản, tôi đang tìm kiếm một cách để chuyển hướng đầu ra in của subprocesses đến stdout chính, tương đương với IPython củaIn ấn để stdout trong các quy trình song song IPython

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

In ấn bên trong quá trình này không hoạt động:

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()) 

trả về

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

Do đó việc tính toán thực thi chính xác, nhưng lệnh in trong hàm ff không bao giờ được in, ngay cả khi tất cả các quy trình đều trả về d. Tôi đang làm gì sai? Làm cách nào để in "in"?

Trả lời

9

Nó thực sự giống với subprocess.Popen(... , stdout=PIPE) hơn bạn mong đợi. Giống như đối tượng Popen có thuộc tính stdout, bạn có thể đọc để xem chi tiết của quy trình con, Một AsyncResult có thuộc tính stdout có chứa giá trị được lấy từ các công cụ. Sự khác biệt trong đó AsyncResult.stdout là một danh sách các chuỗi của, trong đó mỗi mục trong danh sách là giá trị của một công cụ duy nhất làm chuỗi.

Vì vậy, để bắt đầu ra:

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() 

cho

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

Chúng ta có thể xem danh sách AsyncResult.stdout của chuỗi:

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

Chúng ta có thể thấy các thiết bị xuất chuẩn của kết quả async :

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

mà in:

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

here is a notebook với tất cả điều này chứng minh.

Một số điều cần lưu ý, dựa trên câu hỏi của bạn:

  1. bạn phải đợi cho asyncResult để kết thúc, trước khi kết quả đầu ra đã sẵn sàng (async.get())
  2. display_outputs() không trả lại bất cứ điều gì - nó thực sự làm việc in/hiển thị chính nó, vì vậy print(async.display_outputs()) không có ý nghĩa.
+0

Câu trả lời rất hữu ích. Có cách nào để xem bản in ra khi tính toán đang diễn ra không? – spencerlyon2

+0

có - đối với các câu lệnh in, chỉ cần thực hiện 'out in asyncresult.stdout: in ra', bạn có thể thực hiện bất kỳ lúc nào, ngay cả khi đầu ra là một phần. – minrk

+1

Có cách nào để đạt được điều này mà không có quyền truy cập vào mã nguồn không? Có một thư viện mà tôi đang sử dụng để in các thông điệp tường trình trong các chủ đề, và tôi muốn nó in khi nó chạy. Tôi có phải mở rộng một trong các lớp của IPython để làm điều này không? – hgcrpd