【Python 3.6爬虫学習記録】(十四)マルチスレッド爬虫テンプレートまとめ
10137 ワード
前言:ここ数日忙しくてホームページを作って游んで、ネット上にも教程がありません.ドメイン名を買うのは解析しなければならないし、登録しなければならないし、本当に面倒で、簡単なHTMLページではそんなに面倒ではないと思います.昨日またいくつかのマルチスレッド爬虫類の例を見て、とても良いと思って、精錬して、いくつかの応用テンプレートをまとめました.
目次 ディレクトリ マルチスレッドThreadingモジュール 1-1簡単な関数はマルチスレッド を作成します.2-1クラスパッケージスレッドオブジェクト 二マルチスレッドQueueモジュール 2-1 QueueとThreadingモジュール を使用
三多プロセス同時モジュール 3-1 QueueとThreadingの同時実行 3-2 multiprocessingモジュール同時 を実現
マルチスレッドThreadingモジュール
1-1単純な関数マルチスレッドの作成
2-1クラス包装スレッドオブジェクト
デュアルスレッドQueueモジュール
2-1 QueueとThreadingモジュールの使用
トリプルプロセス同時モジュール
3-1 QueueとThreadingの同時実行
3-2 multiprocessingモジュール同時実行
後記:理解していないものもありますが、テンプレートを直接セットすることができます.簡単に簡単に言えば、クラスでThreadingモジュールを包装することができますが、もしアプリケーションの対象が多いならば、このように一気にすべてのスレッドを開いて、詰まって死んで、解決方法があるでしょう.まだ調べていません.そして、タスクオブジェクトが多い場合は、queueモジュールを直接使用して、一定のスレッドだけを開いて、順番に実行します.現在のアプリケーションはいいですね.最後に、マルチプロセスの同時性についてはまだよく分からないので、後で理解しましょう.その間に協程も見て、知識が足りなくなってから勉強します.
参考リンク:Python爬虫類進級5のマルチスレッドの使い方Python爬虫類(5)–マルチスレッド続(Queue)Python爬虫類インスタンス2-マルチスレッド爬虫類抓取不祥事百科データPython爬虫類(4)–マルチスレッド
目次
マルチスレッドThreadingモジュール
1-1単純な関数マルチスレッドの作成
## thread
import socket
import threading
import requests
tasks = []
lock = threading.Lock() #
#
def worker(i):
socket.setdefaulttimeout(5) #
try:
r = requests.get(url)
lock.acquire() #
print('Processing ',i)
lock.release() #
except Exception as e:
lock.acquire()
print(e)
lock.release()
#
threads = []
for i in range(len(tasks)):
# , ,
thread = threading.Thread(target=worker, args=[i])
# IP ,
threads.append(thread)
thread.start()
# ,
# ,
for thread in threads:
thread.join()
2-1クラス包装スレッドオブジェクト
import threading
import time
class myThread(threading.Thread):
'''
'''
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print("Starting " + self.name)
'''
'''
# , True
# timeout
# False
threadLock.acquire()
''' ,
'''
print(self.name, self.counter, 3)
#
threadLock.release()
threadLock = threading.Lock()
threads = []
''' , ,
'''
for i in range(1,3):
#
thread = myThread(i, "Thread-%s"%i, i)
#
thread.start()
#
threads.append(thread)
#
for t in threads:
t.join()
print("iting Main Thread")
デュアルスレッドQueueモジュール
2-1 QueueとThreadingモジュールの使用
import os
import random
import threading
import time
from queue import Queue
import requests
class myThread(threading.Thread):
def __init__(self,func):
#
super(myThread, self).__init__()
#
self.func=func
def run(self):
'''
run
'''
self.func()
#
def worker():
global Q
while not Q.empty():
#
item = Q.get()
'''
'''
# Queue,
Q.task_done()
'''
'''
#
def main():
global Q
threads = []
#
for task in range(len(tasks)):
Q.put(tasks[task])
#
for i in range(thread_num):
thread = myThread(worker)
thread.start()
threads.append(thread)
#
for thread in threads :
thread.join()
#
Q.join()
#
if __name__ == '__main__':
#
Q = Queue()
#
thread_num = 100
#
tasks = []
start = time.time()
main()
end = time.time()
print('It takes ',end-start)
トリプルプロセス同時モジュール
3-1 QueueとThreadingの同時実行
#
from queue import Queue
from threading import Thread
from time import sleep
#q
#NUM
#JOBS
q = Queue()
NUM = 2
JOBS = 10
# ,
def do_somthing_using(arguments):
print(arguments)
# ,
def working():
while True:
arguments = q.get()
do_somthing_using(arguments)
sleep(1)
q.task_done()
#fork NUM
for i in range(NUM):
t = Thread(target=working)
t.setDaemon(True)
t.start()
# JOBS
for i in range(JOBS):
q.put(i)
# JOBS
q.join()
3-2 multiprocessingモジュール同時実行
from multiprocessing import Pool
pool = Pool(8)
data_list = pool.map(get, url_list)
pool.close()
pool.join()
後記:理解していないものもありますが、テンプレートを直接セットすることができます.簡単に簡単に言えば、クラスでThreadingモジュールを包装することができますが、もしアプリケーションの対象が多いならば、このように一気にすべてのスレッドを開いて、詰まって死んで、解決方法があるでしょう.まだ調べていません.そして、タスクオブジェクトが多い場合は、queueモジュールを直接使用して、一定のスレッドだけを開いて、順番に実行します.現在のアプリケーションはいいですね.最後に、マルチプロセスの同時性についてはまだよく分からないので、後で理解しましょう.その間に協程も見て、知識が足りなくなってから勉強します.
参考リンク:Python爬虫類進級5のマルチスレッドの使い方Python爬虫類(5)–マルチスレッド続(Queue)Python爬虫類インスタンス2-マルチスレッド爬虫類抓取不祥事百科データPython爬虫類(4)–マルチスレッド