Я проверяю следующий код, и я хотел бы, чтобы убедиться, если это правильно:многопоточных в Python (мой код правильный)
from threading import Thread
import cPickle
def get_user(start, end):
global users, vusers
for j in range(start,end):
if str(users[j]).find('@N') != -1:
vusers.append(users[j])
if __name__ == '__main__':
users = cPickle.load(open('nsid.dmp', 'r'))
vusers = []
jobs = [Thread(target=get_user, args=(0,1839))\
,Thread(target=get_user, args=(1840,3679))\
,Thread(target=get_user, args=(3680,5519))\
,Thread(target=get_user, args=(5520,7359))\
,Thread(target=get_user, args=(7360,9199))\
,Thread(target=get_user, args=(9200,11039))\
,Thread(target=get_user, args=(11040,12879))\
,Thread(target=get_user, args=(12880,14719))\
,Thread(target=get_user, args=(14720,16559))\
,Thread(target=get_user, args=(16560,18399))\
,Thread(target=get_user, args=(18400,20239))\
,Thread(target=get_user, args=(20240,20079))\
,Thread(target=get_user, args=(22080,23919))\
,Thread(target=get_user, args=(23920,25759))\
,Thread(target=get_user, args=(25760,27599))\
,Thread(target=get_user, args=(27600,29439))]
for jb in jobs:
jb.start()
for jb in jobs:
jb.join()
vusers = list(set(vusers))
out = open('validu.dmp', 'w')
cPickle.dump(vusers, out)
out.close()
Так что я пытаюсь сделать, это запустить параллельно, функция get_user
с различными диапазонами. Конечно, функция get_user
сложнее, чем это, и есть много других условий для проверки, но когда я запускал код, я не мог видеть, что это более эффективное время. Что-то не так в моем коде, и это правильный способ написать многопоточную функцию? Если нет, как я могу заставить его работать параллельно?
Если вы хотите, чтобы это было быстрее, попробуйте 'pypy'. Но если вы хотите понять, как сделать алгоритмы, выполняемые параллельно оптимально с использованием Python, используйте «многопроцессорность», как указано в ответах. Обратите внимание, что он вводит гораздо более сложную задачу, потому что вы должны отправлять входные данные и извлекать выходные данные и синтезировать их. –
@BrianCain будет работать, если я заменил 'Thread' на multiprocessing.Process затем собирает данные, как описано здесь: \t http://stackoverflow.com/questions/8329974/can-i-get-a-return-value-from -multiprocessing-process – user9287