'Return Tag instances for the tags which match the `tags` filter,
parsing and all lxml stuff is done in another process and the Tag
instances are sent to the main process (the one calling this method)
through a pipe
Some things to note:
* Not all responses can be parsed, so I need to call DocumentParser
and handle exceptions
* The parser selected by DocumentParser might not have tags, and
it might not have get_tags_by_filter. In this case just return an
empty list
* Just like get_document_parser_for we have a timeout in place,
when we hit the timeout just return an empty list, this is not
the best thing to do, but makes the plugin code easier to write
(plugins would ignore this anyways)
:param tags: The filter
:param yield_text: Should we yield the tag text?
:return: A list of Tag instances as defined in sgml.py
:see: SGMLParser.get_tags_by_filter'

def get_tags_by_filter(self, http_response, tags, yield_text=False):

    self.start_workers()
    hash_string = get_request_unique_id(http_response, prepend='tags')
    apply_args = (process_get_tags_by_filter, http_response, tags, yield_text, self._processes, hash_string, self.DEBUG)
    result = self._pool.apply_async(apply_with_return_error, (apply_args,))
    try:
        filtered_tags = result.get(timeout=self.PARSER_TIMEOUT)
    except multiprocessing.TimeoutError:
        self._kill_parser_process(hash_string, http_response)
        return []
    else:
        if isinstance(filtered_tags, Error):
            return []
    finally:
        self._processes.pop(hash_string, None)
    return filtered_tags
