在Python和Google云服务中使用多处理时出现SSL错误

在Python和Google云服务中使用多处理时出现SSL错误,python,ssl,multiprocessing,google-cloud-datastore,google-cloud-storage,Python,Ssl,Multiprocessing,Google Cloud Datastore,Google Cloud Storage,在Flask上的应用程序中,我在一批文件中使用了多处理—用户上载了一个包含许多pdf文件的.zip文件—上载后,在数据库中为每个文件创建一个新实体,然后启动一个线程并调用一个多处理池,以便每个文件启动一个进程,该进程与谷歌云服务(如谷歌存储和谷歌数据存储)进行交互 import threading import multiprocessing import sys class ProcessMulti(threading.Thread): def __init__(self, file

在Flask上的应用程序中,我在一批文件中使用了多处理—用户上载了一个包含许多pdf文件的.zip文件—上载后,在数据库中为每个文件创建一个新实体,然后启动一个线程并调用一个多处理池,以便每个文件启动一个进程,该进程与谷歌云服务(如谷歌存储和谷歌数据存储)进行交互

import threading
import multiprocessing
import sys

class ProcessMulti(threading.Thread):
    def __init__(self, files_ids):
        self.files_ids = files_ids
        super().__init__()

    def run(self):
        with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
            for i, _ in enumerate(pool.imap_unordered(process_one, self.files_ids), 1):
                sys.stderr.write('\rdone {0:%}'.format(i/len(self.files_ids)))

def process_one(file_id):

    print("Process started by {}".format(file_id))
    file = File(file_id)
    file.process()
    print("Process finished by {}".format(file_id))

    return file.id
在File对象内部,有一些与Google数据存储和Google存储的琐碎交互,例如从bucket中重编文件或修改数据。当地一切都很顺利。。。但是,在使用SSL连接的生产环境中,当尝试启动流程时,会抛出以下错误,并且根本不会发生任何事情:

Process started by 5377634535997440
E1004 15:49:32.711329522   32255 ssl_transport_security.cc:476] Corruption detected.
E1004 15:49:32.711356181   32255 ssl_transport_security.cc:452] error:100003fc:SSL routines:OPENSSL_internal:SSLV3_ALERT_BAD_RECORD_MAC
E1004 15:49:32.711361146   32255 secure_endpoint.cc:208]     Decryption error: TSI_DATA_CORRUPTED

有人知道是什么导致了这个错误吗?我做了一些研究,发现了一些与SSL套接字过载相关的错误。。。但我不知道应该采取哪些措施来解决这个问题,也不知道有哪些替代方案可以替代具有类似性能的多处理。谢谢。

我最终将多线程处理和线程操作交换到芹菜任务队列,因为在连接到gcloud服务时存在一些我无法克服的线程安全问题。芹菜的实现对于我的应用程序上的许多异步任务来说是一个很好的解决方案

#Import celery instance with app context already set
from main_app import celery

@celery.task
def process_one(file_id):

    print("Process started by {}".format(file_id))
    file = File(file_id)
    file.process()
    print("Process finished by {}".format(file_id))

    return file.id

您显示的代码中没有关于SSL的内容。但是,如果客户端和服务器中都使用SSL套接字,则会出现此类问题。由于SSL状态为每个进程,因此一个进程中的任何SSL活动都会隐式地使另一个进程中的SSL状态无效。@SteffenUllrich感谢您的评论,因此,如果SSL状态为每个进程,那么使用多进程的更好做法是什么?是否为每个进程单独创建SSL状态?我如何归档呢?SSL状态绑定到SSL套接字。因此,不要在两个不同的进程中使用相同的SSL套接字。例如,在服务器中执行TCP级别的
accept
,但在子进程中执行
ssl\u wrap
,以便ssl状态仅在子进程中。此github问题现在标记为已关闭,但似乎与您正在经历的情况有关。如果有什么不同的话,在该问题的评论中有一些关于google云存储python客户端的多线程的有用信息。