1、使用threading模組建立執行緒
方式一:把函式傳入並建立thread例項,然後呼叫start方法開始執行
# coding=utf8
"""建立多執行緒的方式一:
把函式傳入並建立thread例項,然後呼叫start方法開始執行
"""import random, time
import threading
def thread_run(urls):
print 'current thread %s is running...' % threading.current_thread().name
for url in urls:
print '%s -->>> %s' % (threading.current_thread().name, url)
time.sleep(random.random())
print '%s ended.' % threading.current_thread().name
if __name__ == '__main__':
print 'current thread %s is running...' % threading.current_thread().name
t1 = threading.thread(target=thread_run, name='thread_1', args=(['url_1','url_2','url_3'],))
t2 = threading.thread(target=thread_run, name='thread_2', args=(['url_4','url_5','url_6'],))
t1.start()
t2.start()
t1.join()
t2.join()
print '%s ended.' % threading.current_thread().name
方式二:繼承thread類,重寫__init__和run方法# coding=utf8
'''建立多執行緒方式二:
繼承thread類,重寫__init__和run方法
'''import threading
import time, random
class mythread(threading.thread):
def __init__(self, name, urls):
threading.thread.__init__(self, name=name)
self.urls = urls
def run(self):
print 'current thread %s is running...' % threading.current_thread().name
for url in self.urls:
print '%s -->>> %s' % (threading.current_thread().name, url)
time.sleep(random.random())
print '%s ended.' % threading.current_thread().name
if __name__ == '__main__':
print 'current thread %s is running...' % threading.current_thread().name
t1 = mythread(name='thread_1', urls=['url_1','url_2','url_3'])
t2 = mythread(name='thread_2', urls=['url_4','url_5','url_6'])
t1.start()
t2.start()
t1.join()
t2.join()
print '%s ended.' % threading.current_thread().name
2、執行緒同步
使用lock和rlock可以實現簡單的執行緒同步,將每次只允許乙個執行緒操作的資料放到acqure和release方法之間
# coding=utf8
import threading
mylock = threading.rlock()
num = 0
class mythread(threading.thread):
def __init__(self,name):
threading.thread.__init__(self, name=name)
def run(self):
global num
while true:
mylock.acquire()
print '%s locked, number: %d' % (threading.current_thread().name, num)
if num >= 4:
mylock.release()
print '%s released, number: %d' % (threading.current_thread().name, num)
break
num += 1
print '%s released, number: %d' % (threading.current_thread().name, num)
mylock.release()
if __name__ == '__main__':
thread1 = mythread('thread_1')
thread2 = mythread('thread_2')
thread1.start()
thread2.start()
輸出1:
輸出2:
Python爬蟲 程序和執行緒1
1 使用multiprocessing 模組建立多程序 process process類描述乙個程序物件,建立process例項只需要傳入乙個函式和函式的引數即可。使用 process 方法建立程序 使用 start 方法啟動程序 使用 join 方法實現程序同步 乙個例子 coding utf8 ...
Python爬蟲 非同步爬蟲(多程序和多執行緒)
非同步爬蟲 在爬蟲中使用非同步實現高效能的資料爬取操作 執行緒是程式執行的最小單位,乙個程序可以有多個執行緒。非同步爬蟲的方式 多程序,多執行緒 不建議 好處 可以為相關阻塞的操作單獨開啟程序或者執行緒,阻塞操作就可以非同步執行 繼續執行阻塞的操作之後的 弊端 無法無限制地開啟多程序或者多執行緒 程...
python 爬蟲 多執行緒 多程序
乙個程式至少有乙個程序,乙個程序至少有乙個執行緒.資源 程序擁有獨立資源,執行緒依賴於程序,沒有獨立資源,所有該程序的執行緒共享所在程序的所有資源。劃分尺度 執行緒的劃分尺度小於程序 資源比程序少 使得多執行緒程式併發性更高。執行緒 執行緒的執行開銷小,但不利於資源的管理和儲存。程序 多個程序之間相...