Tôi đang cố gắng làm một số âm mưu song song để hoàn thành công việc hàng loạt lớn nhanh hơn. Để kết thúc này, tôi bắt đầu một chủ đề cho mỗi cốt truyện tôi có kế hoạch làm.Matplotlib: đồng thời vẽ trong nhiều chủ đề
Tôi đã hy vọng rằng mỗi chuỗi sẽ kết thúc âm mưu của nó và đóng chính nó (như tôi đã hiểu nó, Python đóng chủ đề khi chúng vượt qua tất cả các câu lệnh trong run()). Dưới đây là một số mã cho thấy hành vi này.
Nếu dòng tạo hình được nhận xét, nó chạy như mong đợi. Một miếng ngon đáng tin cậy khác là nó cũng chạy như mong đợi khi bạn chỉ sinh ra một sợi.
import matplotlib.pyplot as plt
import time
import Queue
import threading
def TapHistplots():
## for item in ['str1']:
# # it behaves as expected if the line above is used instead of the one below
for item in ['str1','str2']:
otheritem = 1
TapHistQueue.put((item, otheritem))
makeTapHist().start()
class makeTapHist(threading.Thread):
def run(self):
item, otheritem = TapHistQueue.get()
fig = FigureQueue.get()
FigureQueue.put(fig+1)
print item+':'+str(fig)+'\n',
time.sleep(1.3)
plt.figure(fig) # comment out this line and it behaves as expected
plt.close(fig)
TapHistQueue = Queue.Queue(0)
FigureQueue = Queue.Queue(0)
def main():
start = time.time()
"""Code in here runs only when this module is run directly"""
FigureQueue.put(1)
TapHistplots()
while threading.activeCount()>1:
time.sleep(1)
print 'waiting on %d threads\n' % (threading.activeCount()-1),
print '%ds elapsed' % (time.time()-start)
if __name__ == '__main__':
main()
Mọi trợ giúp đều được đánh giá cao.
Bạn đã không thực sự nói gì sai, mặc dù nó có vẻ như một số loại vấn đề đồng thời luồng. –
Tôi không thực sự chắc chắn điều gì sai. Tôi không nhận được bất kỳ lỗi nào và quá trình python tiếp tục chạy. Ngoài ra, lệnh in trong chuỗi chính sẽ bị tắt sau mỗi giây không làm như vậy sau giây đầu tiên. Một cái nhìn trong trình quản lý tác vụ cho thấy rằng quá trình tiếp tục sử dụng rất nhiều cpu. Tôi không có kinh nghiệm hạn chế trong việc gỡ lỗi nghiêm trọng. – Boris
Bạn có ý định gọi 'makeTapHist(). Start()' nhiều lần không? Có vẻ như nó nên ở bên ngoài vòng lặp. –