Форум сайта python.su
Здравствуйте, нужна помощь с мультипроцессингом.
Изначальный скрипт:
import socket import time start = time.clock() with open('test.txt') as f: l = f.read().splitlines() f.close() for x in l: try: print (socket.gethostbyname(x)) except socket.gaierror: print('error',end=' ') print (x) pass end = time.clock() print ('Time: %s' % (end - start))
#!/usr/bin/env python from threading import Thread import subprocess from queue import Queue import socket import time start = time.clock() with open('test.txt') as f: l = f.read().splitlines() f.close() num_threads = 3 queue = Queue() def getip(i, q): while True: ip = q.get() try: print(socket.gethostbyname(ip)) except socket.gaierror: print('error',end=' ') print (ip) pass q.task_done() for i in range(num_threads): worker = Thread(target=getip, args=(i, queue)) worker.setDaemon(True) worker.start() for ip in l: queue.put(ip) print ("Main Thread Waiting") queue.join() print ("Done") end = time.clock() print ('Time: %s' % (end - start))
#!/usr/bin/env python from queue import Queue import socket import time from multiprocessing import Process start = time.clock() with open('test.txt') as f: l = f.read().splitlines() f.close() num_threads = 3 queue = Queue() def getip(i, q): while True: ip = q.get() try: print(socket.gethostbyname(ip)) except socket.gaierror: print('error',end=' ') print (ip) pass q.task_done() if __name__ == '__main__': for i in range(num_threads): worker = Process(target=getip, args=(i, queue)) worker.start() for ip in l: queue.put(ip) print ("Main Thread Waiting") queue.join() print ("Done") end = time.clock() print ('Time: %s' % (end - start))
Отредактировано kloma (Сен. 12, 2013 19:44:21)
Офлайн
Наверное, потому что вы пихаете instance обычной Queue, которая не знает ничего про multiprocessing.
Попробуйте from multiprocessing import Queue
Офлайн
Теперь скрипт работает но не завершается т.к пришлось убрать q.task_done() и queue.join()
Чем заменить для multiprocessing ?
Офлайн
А пробовали доки почитать? http://docs.python.org/2/library/multiprocessing.html#multiprocessing.JoinableQueue
Офлайн
если добавляю q.task_done() получаю ошибку:
AttributeError: ‘Queue’ object has no attribute ‘task_done’
________
Так же пробовал так:
if q.get() == 'None': break
Отредактировано kloma (Сен. 13, 2013 00:36:46)
Офлайн
kloma
возьмите лучше отдельный модуль Queue, вот тут написано по русски с примерами, без проблем все сделаете.
Офлайн
если добавляю q.task_done() получаю ошибку:Я вам уже даже прямую ссылку на документацию, вы читать умеете?
AttributeError: ‘Queue’ object has no attribute ‘task_done’
Офлайн
возьмите лучше отдельный модуль Queue, вот тут написано по русски с примерами, без проблем все сделаете.“Отдельный” т.е. стандартный Queue не подойдёт, он использует multiprocesssing. К вам такой же вопрос, вы читать умеете, читали, о чём топик?
Офлайн
lorien
да, умею. Оцениваю задачу из первого поста, а конкретно из изначального скрипта. Задачу можно решить по разному, и ее можно решить за счет потоков (что автор и пытался сделать, но по неведомой причине у него не получилось, что мне кажется просто недочетом)
Офлайн
У меня мало опыта работы с socket/threading, не помню есть ли там проблема, что если один сокет подвисает, то подвисают все или это только с urllib/threading связано.
Офлайн