【Python】多进程读取openslide数据

# -*- coding:utf-8 -*-
from multiprocessing import Process, Manager
import time
import random
import numpy as np
import openslide

from multiprocessing.managers import BaseManager
from multiprocessing.pool import Pool


class A:
    def __init__(self, slide):
        self.slide = slide

    def get_data(self):
        return self.slide

class MyManager(BaseManager):
    pass

MyManager.register('A', A)

def kkk(a_list, coordi_list, slide_path, h, w, number):
    slide = openslide.OpenSlide(slide_path)
    for y_start, patch_h, i in coordi_list:
        # a_list[i] = np_arr[i]
        # a_list[i] = np.array(slide.read_region((0, j), 0, (w, 100)))[:,:,:3]
        a_list[i] = np.array(slide.read_region((0, y_start), 0, (w, patch_h)))[:, :, :3]
        # time.sleep(random.randrange(2))
        print('这是进程{} 坐标{} {}'.format(number, y_start, patch_h))
        # print('这是进程{} {}'.format(number, a_list[i]))
    # print('这是进程{} {}'.format(number, a_list))


def jjj(a_list, coordi_list, slide_path, h, w, num_workers):
    for i in range(num_workers):
        process = Process(target=kkk, args=(a_list, coordi_list[i], slide_path, h, w, i))
        process.start()


if __name__ == '__main__':
    start_time = time.time()
    slide_path = r"D:\test_multiprocess_ndpi\a.ndpi"
    slide = openslide.OpenSlide(slide_path)
    w, h = slide.level_dimensions[0]

    every_h = 2000
    num_workers = 4

    h_stride = h // every_h
    h_retain = h - every_h*h_stride
    coordis = []
    for i in range(h_stride):
        coordis.append([i * every_h, every_h, i])
    if h_retain > 0:
        coordis.append([every_h*h_stride, h_retain, h_stride])

    all_worker_coordis = []
    every_worker_num = len(coordis) // num_workers
    for i in range(num_workers):
        if i == num_workers-1:
            all_worker_coordis.append(coordis[i*every_worker_num:])
        else:
            all_worker_coordis.append(coordis[i * every_worker_num:(i+1) * every_worker_num])

    # np_arr = np.random.randint(10, size=(len(coordis), w))
    # a = np.zeros((h,w), dtype=np.uint8).tolist()
    manager = Manager()
    # manager2 = MyManager()
    a_list = manager.list(coordis)
    coordi_list = manager.list(all_worker_coordis)
    # new_slide = A(slide)
    # new_slide = manager2.A(slide)
    # a_list = []
    process_0 = Process(target=jjj, args=(a_list, coordi_list, slide_path, h, w, num_workers))
    process_0.start()
    process_0.join()
    # print(a_list[:5][:10])
    print(len(a_list))
    print('it\'s ok')
    print(time.time() - start_time)


# # -*- coding:utf-8 -*-
# from multiprocessing import Process, Manager
# import time
# import random
# def kkk(a_list, number):
#   for i in range(10):
#     a_list.append(np.array([i]))
#     time.sleep(random.randrange(2))
#     print('这是进程{} {}'.format(number, a_list))
#   print('这是进程{} {}'.format(number, a_list))
# def jjj(a_list):
#   for i in range(2):
#     process = Process(target=kkk, args=(a_list, i))
#     process.start()
# if __name__ == '__main__':
#   manager = Manager()
#   a_list = manager.list()
#   # a_list = []
#   process_0 = Process(target=jjj, args=(a_list,))
#   process_0.start()
#   process_0.join()
#   print(a_list)
#   print(len(a_list))
#   print('it\'s ok')

猜你喜欢

转载自blog.csdn.net/u013066730/article/details/114090360