#!/bin/env python
# coding: utf-8
import queue
import threading
from contextlib import contextmanager
import time
#停止事件
stopevent = object()
class threadpool(object):
def __init__(self, max_num):
self.q = queue.queue(max_num)
self.max_num = max_num
self.cancel = false
self.terminal = false
self.active_threads =
self.free_threads =
#執行緒池執行乙個任務
def run(self, func, args):
if self.cancel:
return
if len(self.free_threads) == 0 and len(self.active_threads) < self.max_num:
self.new_thread()
w = (func, args)
self.q.put(w)
#建立乙個執行緒
def new_thread(self):
t = threading.thread(target=self.call)
t.start()
#獲取任務並執行
def call(self):
current_thread = threading.currentthread()
event = self.q.get()
while event != stopevent:
func, args = event
try:
result = func(*args)
success = true
except exception as e:
success = false
result = none
with self.worker_state(self.free_threads, current_thread):
if self.terminal:
event = stopevent
else:
event = self.q.get()
else:
self.active_threads.remove(current_thread)
#執行完所有的任務後,所有執行緒停止
def close(self):
self.cancel = true
count = len(self.active_threads)
while count:
self.q.put(stopevent)
count -= 1
#終止執行緒
def terminate(self):
self.terminal = true
while self.active_threads:
self.q.put(stopevent)
self.q.queue.clear()
#用於記錄執行緒中正在等待的執行緒數
@contextmanager
def worker_state(self, state_threads, worker_thread):
try:
yield
finally:
state_threads.remove(worker_thread)
pool = threadpool(5)
#使用者定義的任務
def task(i):
print(i)
for i in range(30):
ret = pool.run(task, (i,))
time.sleep(3)
pool.close()
python 執行緒池 requests簡易爬蟲框架
多執行緒 requests的微爬蟲框架 1.scheduler 排程器 可以通過自定義排程方法,執行緒數來編寫排程檔案 3.pipelines 儲存器 可以自定義儲存資料方法 4.spider 爬蟲的主要邏輯編寫 自定義抓取方式,解析資料 採用執行緒池方法啟動爬蟲,可以一次性新增任務,也可以通過判斷...
簡易執行緒池實現
是其實也就是任務分發器,池子裡預先跑著n個執行緒,可以往池子裡提交任務。相對執行緒不斷建立和銷毀,特別對於大量的短時任務,執行緒池顯然是很節省資源的。直接上 include include include include include include typedef void job void d...
c 簡易執行緒池
以前做均衡負載的時候就想寫過執行緒池,那時候沒有很理解就沒寫,最近嘗試自己搭個高併發的小型伺服器,又學習了下執行緒池,但感覺網上的大多涉及的技術點比較多,對於初學者不容易理解,這裡我也分享下我自己寫的簡易執行緒池,除錯環境在ubuntu18.04。該執行緒池通過設定任務函式 搬運工 不斷地訪問等待佇...