Форум сайта python.su
0
Здравствуйте, нужна помощь с мультипроцессингом.
Изначальный скрипт:
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
Офлайн
0
Теперь скрипт работает но не завершается т.к пришлось убрать q.task_done() и queue.join()
Чем заменить для multiprocessing ?
Офлайн
А пробовали доки почитать? http://docs.python.org/2/library/multiprocessing.html#multiprocessing.JoinableQueue
Офлайн
0
если добавляю q.task_done() получаю ошибку:
AttributeError: ‘Queue’ object has no attribute ‘task_done’
________
Так же пробовал так:
if q.get() == 'None': break
Отредактировано kloma (Сен. 13, 2013 00:36:46)
Офлайн
221
kloma
возьмите лучше отдельный модуль Queue, вот тут написано по русски с примерами, без проблем все сделаете.
Офлайн
если добавляю q.task_done() получаю ошибку:Я вам уже даже прямую ссылку на документацию, вы читать умеете?
AttributeError: ‘Queue’ object has no attribute ‘task_done’
Офлайн
возьмите лучше отдельный модуль Queue, вот тут написано по русски с примерами, без проблем все сделаете.“Отдельный” т.е. стандартный Queue не подойдёт, он использует multiprocesssing. К вам такой же вопрос, вы читать умеете, читали, о чём топик?
Офлайн
221
lorien
да, умею. Оцениваю задачу из первого поста, а конкретно из изначального скрипта. Задачу можно решить по разному, и ее можно решить за счет потоков (что автор и пытался сделать, но по неведомой причине у него не получилось, что мне кажется просто недочетом)
Офлайн
У меня мало опыта работы с socket/threading, не помню есть ли там проблема, что если один сокет подвисает, то подвисают все или это только с urllib/threading связано.
Офлайн