'start this pool, and wait for finishing
:param fetcher_num: not useful if self._inst_fetcher is a list or tuple
:param is_over: stop monitor thread or not, default True'

def start_work_and_wait_done(self, fetcher_num=10, is_over=True):

    logging.warning('%s    start:    fetcher_num=%s,    is_over=%s', self.__class__.__name__, fetcher_num, is_over)
    if isinstance(self._inst_fetcher, (list, tuple)):
        fetcher_list = [FetchThread(('fetcher-%d' % (i + 1)), fetcher, self) for (i, fetcher) in enumerate(self._inst_fetcher)]
    else:
        fetcher_list = [FetchThread(('fetcher-%d' % (i + 1)), copy.deepcopy(self._inst_fetcher), self) for i in range(fetcher_num)]
    parser_saver_list = [ParseThread('parser', self._inst_parser, self), SaveThread('saver', self._inst_saver, self)]
    for thread in fetcher_list:
        thread.setDaemon(True)
        thread.start()
    for thread in parser_saver_list:
        thread.setDaemon(True)
        thread.start()
    for thread in fetcher_list:
        if thread.is_alive():
            thread.join()
    while (self.get_number_dict(TPEnum.URL_NOT_FETCH) > 0):
        self.get_a_task(TPEnum.URL_FETCH)
        self.finish_a_task(TPEnum.URL_FETCH)
    for thread in parser_saver_list:
        if thread.is_alive():
            thread.join()
    if (is_over and self._monitor.is_alive()):
        self._monitor_stop = True
        self._monitor.join()
    logging.warning('%s    end:    fetcher_num=%s,    is_over=%s', self.__class__.__name__, fetcher_num, is_over)
    return
