def get_lyrics_threaded(song, l_sources=None):
if l_sources is None:<EOL><INDENT>l_sources = sources<EOL><DEDENT>if song.lyrics and not CONFIG['<STR_LIT>']:<EOL><INDENT>logger.debug('<STR_LIT>', song)<EOL>return None<EOL><DEDENT>runtimes = {}<EOL>queue = Queue()<EOL>pool = [LyrThread(source, song, queue) for source in l_sources]<EOL>for thread in pool:<EOL><INDENT>thread.start()<EOL><DEDENT>for _ in range(len(pool)):<EOL><INDENT>result = queue.get()<EOL>runtimes[result['<STR_LIT:source>']] = result['<STR_LIT>']<EOL>if result['<STR_LIT>']:<EOL><INDENT>break<EOL><DEDENT><DEDENT>if result['<STR_LIT>']:<EOL><INDENT>song.lyrics = result['<STR_LIT>']<EOL>source = result['<STR_LIT:source>']<EOL><DEDENT>else:<EOL><INDENT>source = None<EOL><DEDENT>return Result(song, source, runtimes)<EOL>
Launches a pool of threads to search for the lyrics of a single song.

The optional parameter 'sources' specifies an alternative list of sources.
If not present, the main list will be used.