0
0 Комментариев

Следующий код:

import threading
import sys
import hashlib
import multiprocessing
 
class ProcessFileHandler(multiprocessing.Process):
    def __init__(self, file_path):
        multiprocessing.Process.__init__(self)
        self.file_path = file_path
        self.hasher = hashlib.sha256()
        self.hash = None
    def run(self):
        with open(self.file_path, 'rb') as f:
            while True:
                chunk = f.read(2047)
                if not chunk:
                    break
                self.hasher.update(chunk)
        self.hash = self.hasher.hexdigest()
    def getHash(self):
        return self.hash
 
def main():
    args = sys.argv[1:]
    if not args:
        exit(1)
 
    handlers_pool = []
 
    for filepath in args:
        handler = ProcessFileHandler(filepath)
        handler.start()
        handlers_pool.append(handler)
 
    for handler in handlers_pool:
        handler.join()
        print(handler.getHash())
 
if __name__ == '__main__':
    main()

Выводит None хэш при любом файле на вход
Однако если изменить multiprocessing на threading все работает, очень странно
Вот код после изменения:

import threading
import sys
import hashlib
import threading
 
class ProcessFileHandler(threading.Thread):
    def __init__(self, file_path):
        threading.Thread.__init__(self)
        self.file_path = file_path
        self.hasher = hashlib.sha256()
        self.hash = None
    def run(self):
        with open(self.file_path, 'rb') as f:
            while True:
                chunk = f.read(2047)
                if not chunk:
                    break
                self.hasher.update(chunk)
        self.hash = self.hasher.hexdigest()
    def getHash(self):
        return self.hash
 
def main():
    args = sys.argv[1:]
    if not args:
        exit(1)
 
    handlers_pool = []
 
    for filepath in args:
        handler = ProcessFileHandler(filepath)
        handler.start()
        handlers_pool.append(handler)
 
    for handler in handlers_pool:
        handler.join()
        print(handler.getHash())
 
if __name__ == '__main__':
    main()

Вот результаты в первом случае и во втором:

Первый случай:

python3 test1.py /Users/user/Downloads/zashhitnyie-mehanizmyi-operatsionnoy-sistemyi-linux.pdf
None

Второй случай:

python3 test1.py /Users/user/Downloads/zashhitnyie-mehanizmyi-operatsionnoy-sistemyi-linux.pdf
4cbdac43afe5cbdcf5afc5c91e4273509974df5797119eb6b58a5eaafe294760


Добавить комментарий