Изначальный скрипт:
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
Подскажите как исправить