python手寫簡易執行緒池

2021-08-21 08:32:57 字數 2067 閱讀 2997

#!/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。該執行緒池通過設定任務函式 搬運工 不斷地訪問等待佇...