Tôi biết có nhiều bài đăng trên Stack Exchange liên quan đến việc viết kết quả từ đa xử lý tới tệp đơn và tôi đã phát triển mã của mình sau khi chỉ đọc những bài đăng đó. Những gì tôi đang cố gắng để đạt được là chạy 'RevMapCoord' chức năng song song và viết kết quả của nó trong một tập tin duy nhất bằng cách sử dụng multiprocess.queue. Nhưng tôi đang gặp vấn đề trong khi xếp hàng công việc của mình. Mã của tôi:Xử lý Python bằng cách sử dụng Hàng đợi để ghi vào cùng một tệp
def RevMapCoord(list):
"Read a file, Find String and Do something"
def feed(queue, parlist):
for par in parlist:
print ('Echo from Feeder: %s' % (par))
queue.put(par)
print ('**Feeder finished queing**')
def calc(queueIn, queueOut):
print ('Worker function started')
while True:
try:
par = queueIn.get(block = False)
res = RevMapCoord(final_res)
queueOut.put((par,res))
except:
break
def write(queue, fname):
fhandle = open(fname, "w")
while True:
try:
par, res = queue.get(block = False)
print >>fhandle, par, res
except:
break
fhandle.close()
feedProc = Process(target = feed , args = (workerQueue, final_res))
calcProc = [Process(target = calc , args = (workerQueue, writerQueue)) for i in range(nproc)]
writProc = Process(target = write, args = (writerQueue, sco_inp_extend_geno))
feedProc.start()
print ('Feeder is joining')
feedProc.join()
for p in calcProc:
p.start()
for p in calcProc:
p.join()
writProc.start()
writProc.join()
Khi tôi chạy tập lệnh mã này sẽ dừng ở bước "feedProc.start()". Một vài dòng đầu ra cuối cùng từ màn hình hiển thị tuyên bố in từ cuối "feedProc.start()":
Echo from Feeder: >AK779,AT61680,50948-50968,50959,6,0.406808,Ashley,Dayne
Echo from Feeder: >AK832,AT30210,1091-1111,1102,7,0.178616,John,Caine
**Feeder finished queing**
Nhưng treo trước khi thực hiện dòng tiếp theo "feedProc.join()". Mã không có lỗi và tiếp tục chạy nhưng không làm gì cả (bị treo). Vui lòng cho tôi biết tôi đang mắc lỗi gì.
Bạn nên cố gắng chạy ví dụ của bạn (nó mang lại cho một lỗi). Bạn không thể đặt nhiều mục trên hàng đợi theo cách này. Bạn đã thực sự chỉ cần đặt một mục duy nhất trên - một danh sách. – Gerrat
'TypeError: dự kiến một đối tượng đệm ký tự' tôi đã có lỗi: | – nk9
@ b1- Phiên bản * mới * (và chính xác, cảm ơn Gerrat) hoạt động với trăn 2.7.5 và 3.2.3. Hãy thử một lần! – Hernan