Python Google Sheets APIv4: многопроцессорность и многопоточность одновременно - PullRequest
0 голосов
/ 31 марта 2019

Я могу настроить многопроцессорность и многопоточность для независимой работы с листами Google APIv4, но не могу заставить их работать вместе.

Многопроцессорная обработка (это работает):

from multiprocessing import Pool
import threading
import pandas

class B:
    def __init__(self):
        self.core = 10
        self.b()

    def b(self):
        p = Pool(self.core)
        p.map(multicore, range(10))

def multicore(*args):
    thread = 0
    if thread == 1:
        thread_list = []
        for i in range(10):
            thread = threading.Thread(target=output_function, args=(i,))
            thread_list.append(thread)
            thread.start()
    else:
        output_function(*args)

def output_function(*args):
    x = args[0]

    print(x * x)
    g.build_service()

    g.export_df(g.test_API_key, ['output!A' + str(x + 1)], [pandas.DataFrame([[x * x]])], 'n')

Многопоточность (это также работает):

def just_threading():
    thread = 1
    if thread == 1:
        thread_list = []
        for i in range(10):
            thread = threading.Thread(target=output_function, args=(i,))
            thread_list.append(thread)
            thread.start()

def output_function(*args):
    x = args[0]

    print(x * x)
    g.build_service()

    g.export_df(g.test_API_key, ['output!A' + str(x + 1)], [pandas.DataFrame([[x * x]])], 'n')

Но когда я комбинирую их, установив thread = 1 для первого примера, я не получаю абсолютно никакого вывода на листы Google (print(x*x) все еще работает).

Что забавно, если я уберу g.build_service(), он выведет несколько строк, пока не столкнется с проблемами безопасности потоков, описанными здесь: https://developers.google.com/api-client-library/python/guide/thread_safety с ошибкой ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:2273). Поэтому восстановление службы имеет значение, но я не вижу вывода на листы!

1 Ответ

1 голос
/ 03 апреля 2019

Вам нужно подождать, пока потоки завершат свою работу, иначе основной поток выйдет до того, как они завершатся.

После того, как вы запустили темы, запустите:

for t in thread_list:
    t.join()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...