python,怎么把数据传递给子线程中,计算完成后在主线程中显示

我想写一个程序,计算文件的MD5和sha1,及crc32,并打印出来。
刚写了sha1和md5。发现读取只做了一次,但是计算却是单核计算,所以就想改成线程提高计算效率,
但是不知道如何把数据传入两个子线程,并且把计算结果取出来。

#!/usr/bin/env python

# -*- coding: utf-8 -*-
import sys
import hashlib
import datetime
import threading
from queue import Queue


class md5(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self, name="md5")

    def run(self):
        while True:
            event.wait()
            file_md5 = hashlib.md5(data).hexdigest()
            event.clear()

class sha1(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self, name="sha1")

    def run(self):
        while True:
            event.wait()
            file_sha1 = hashlib.sha1(data).hexdigest()
            event.clear()


if __name__ == '__main__':
    event = threading.Event()
    file_name = "f:\\1.rar"
    start = datetime.datetime.now()
    md5 = md5()
    md5.start()
    sha1 = sha1()
    sha1.start()
    with open(file_name, 'rb') as fp:
        data = fp.read()
        event.set()
    end = datetime.datetime.now()
    print("耗时合计 : ", end - start)
    print("file_md5 =", file_md5)
    print("file_sha1 =", file_sha1)

代码尚未运行过,有那么几个点不是很懂,百度了一圈,也没找到合适的方法。
1、主线程读取数据,怎么把主线程读取的数据传递给子线程。
2、两个子线程如果都处理完成之后,如何通知主线程继续读取。
3、所有数据读取并计算完成后,主线程如何从子线程读取结果,并显示。

我看到网上有人用队列传递数据,但是貌似不适合这个场景,假定md5 读取了,那么sha1就读取不到了。

求指点!!

首先你这是计算密集型任务,用线程并无法利用多核,更好的办法是利用进程,如果线程是共享变量和上下文的,你完全可以把结果都存入一个列表里面,执行完毕再取出来,你上面的代码逻辑有问题,event用的也不对。