Почему потоки выдают пустой список?
Не знаю где именно ошибка, поэтому выложил весь код, он должен обрабатывать сообщения в gmail ящике, отсортировать и выдать в конце отсортированный массив. Поскольку ему нужно обрабатывать 25000 писем( на моем ящике именно столько) решил попробовать multiprocessing.После запуска потока вместо отсортированного списка выдает пустой массив, с 1 потоком все работает, но обрабатывает все слишком долго.
from __future__ import print_function
import pprint
import os.path
import pickle
from multiprocessing import Process, Value, Array
import multiprocessing
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
def gmail_authenticate():
creds = None
# the file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first time
if os.path.exists("token.pickle"):
with open("token.pickle", "rb") as token:
creds = pickle.load(token)
# if there are no (valid) credentials availablle, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file('client.json', SCOPES)
creds = flow.run_local_server(port=0)
# save the credentials for the next run
with open("token.pickle", "wb") as token:
pickle.dump(creds, token)
return build('gmail', 'v1', credentials=creds)
# get the Gmail API service
service = gmail_authenticate()
'''
msgs = service.users().messages().list(userId='me',maxResults=50000).execute()
for msg in msgs['messages']:
m_id = msg['id'] # get id of individual message
message = service.users().messages().get(userId='me', id=m_id).execute()
payload = message['payload']
header = payload['headers']
#print(header[0]['name'],' '.join(header[1]['value'].split()[6:11]))
print(header[0]['name'],header[1]['value'])'''
messages = []
raw_mes = []
next_page_token = None
kolumn = 2
for _ in range(50):
try:
if next_page_token:
msgs = service.users().messages().list(userId='me',maxResults=500, pageToken=next_page_token).execute()
else:
msgs = service.users().messages().list(userId='me',maxResults=500).execute()
'''for msg in msgs['messages']:
m_id = msg['id'] # get id of individual message
message = service.users().messages().get(userId='me', id=m_id).execute()
payload = message['payload']
header = payload['headers']
type_mes = header[0]['name']
if type_mes == 'MIME-Version':
data = header[1]['value']
data = data.split()
messages.append(['Исходяцее',' '.join(data[1:4])])
else:
messages.append(['Входящее',' '.join(header[1]['value'].split()[7:10])])'''
raw_mes+=msgs['messages']
next_page_token = msgs['nextPageToken']
except:
break
length = len(raw_mes)
m_id = [msg['id'] for msg in raw_mes] # get id of individual message
def get_mes(messag,th):
red_mes = []
message = [service.users().messages().get(userId='me', id=m).execute() for m in messag]
payload = [mess['payload'] for mess in message]
head = [header['headers'] for header in payload]
for hed in head:
type_mes = hed[0]['name']
if type_mes == 'MIME-Version':
data = hed[1]['value']
data = data.split()
red_mes.append(['Исходяцее', ' '.join(data[1:4])])
else:
red_mes.append(['Входящее', ' '.join(hed[1]['value'].split()[7:10])])
print(th)
print(red_mes)
return red_mes
if __name__ == '__main__':
cpus = multiprocessing.cpu_count()
if length % cpus == 0:
pass
proc_1 = Process(target=get_mes, args=(m_id[0:length//4],1,))#m_id[0:length//4
proc_2 = Process(target=get_mes, args=(m_id[(length //4)*2:(length // 4)*3], 2,))
proc_3 = Process(target=get_mes, args=(m_id[(length // 4)*3:(length // 4)*4], 4,))
proc_2.start()
print('2')
proc_3.start()
print('3')
proc_1.start()
print('1')
get_mes(m_id[length//2:(length//2)*2],0)