Найти - Пользователи
Полная версия: Мультипроцессинг
Начало » Python для новичков » Мультипроцессинг
1
kloma
Здравствуйте, нужна помощь с мультипроцессингом.
Изначальный скрипт:
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))

Скрипт берет из файла домены и получает ip. Сперва попробовал ускорить потоками, но ничего хорошего из этого не вышло – время выполнения такое же как и без потоков.

Скрипт с потоками:
#!/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))

Скрипт выдает
_pickle.PicklingError: Can't pickle <built-in method release of _thread.lock obj
ect at 0x0000000028C10B00>: it's not found as __main__.release

Подскажите как исправить



lorien
Наверное, потому что вы пихаете instance обычной Queue, которая не знает ничего про multiprocessing.
Попробуйте from multiprocessing import Queue
kloma
Теперь скрипт работает но не завершается т.к пришлось убрать q.task_done() и queue.join()
Чем заменить для multiprocessing ?
lorien
А пробовали доки почитать? http://docs.python.org/2/library/multiprocessing.html#multiprocessing.JoinableQueue
kloma
если добавляю q.task_done() получаю ошибку:
AttributeError: ‘Queue’ object has no attribute ‘task_done’
________
Так же пробовал так:
if q.get() == 'None':
            break

не сработало
JOHN_16
kloma
возьмите лучше отдельный модуль Queue, вот тут написано по русски с примерами, без проблем все сделаете.
lorien
если добавляю q.task_done() получаю ошибку:
AttributeError: ‘Queue’ object has no attribute ‘task_done’
Я вам уже даже прямую ссылку на документацию, вы читать умеете?
lorien
возьмите лучше отдельный модуль Queue, вот тут написано по русски с примерами, без проблем все сделаете.
“Отдельный” т.е. стандартный Queue не подойдёт, он использует multiprocesssing. К вам такой же вопрос, вы читать умеете, читали, о чём топик?
JOHN_16
lorien
да, умею. Оцениваю задачу из первого поста, а конкретно из изначального скрипта. Задачу можно решить по разному, и ее можно решить за счет потоков (что автор и пытался сделать, но по неведомой причине у него не получилось, что мне кажется просто недочетом)
lorien
У меня мало опыта работы с socket/threading, не помню есть ли там проблема, что если один сокет подвисает, то подвисают все или это только с urllib/threading связано.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB