首頁 > 後端開發 > Python教學 > 詳解python中Threadpool執行緒池任務終止範例程式碼

詳解python中Threadpool執行緒池任務終止範例程式碼

高洛峰
發布: 2017-03-20 13:09:56
原創
4285 人瀏覽過

需求

加入我們需要處理一串個位數(0~9),奇數時需要循環列印它;偶數則等待對應時長並完成所有任務;0則是錯誤,但不需要終止任務,可以自訂一些處理。

關鍵點

定義func函數處理需求

callback處理回傳結果,只有偶數和0回傳;奇數會一直執行;要控制執行緒池狀態,則需要針對偶數和0時拋出異常,並捕獲異常處理

threadpool定義執行緒池並發

實作

1

2

3

4

# -*- coding: utf-8 -*-

from threadpool import makeRequests, ThreadPool

import time

from multiprocessing import Process

登入後複製

例外定義與特殊值(0)定義

1

2

class Finish(SyntaxWarning):

    pass

登入後複製

1

2

3

class PauseInfo(SyntaxWarning):

    pass

pause_num = 0

登入後複製

func函數定義

# 0時傳回False,其他偶數傳回True

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def func(para):

    if para == pause_num:

        print('start for %d and wait %ds' % (para, 4))

        time.sleep(4)

        print('error bcs ',para)

        return False

    if para % 2 == 0:

        print('start for %d and wait %ds' % (para, para))

        time.sleep(para)

        print('stop for', para)

        return True

    while True:

        print('continue for', para)

        time.sleep(para)

登入後複製

callback定義

1

2

3

4

5

def callback(request, result):

    if result:

        raise Finish

    else:

        raise PauseInfo

登入後複製

執行緒池處理

Finish標識任務完成,再次誘發異常退出執行緒池處理;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

def main_thread(paras):

    pool = ThreadPool(10)

    requests = makeRequests(callable_=func, args_list=paras, callback=callback)

    [pool.putRequest(req) for req in requests]

    while True:

        try:

            pool.wait()

        except Finish as e:

            raise SystemExit

        except PauseInfo as e:

            print('Pause bcs %d but will continue' % pause_num)

        except Exception as e:

            print('Unknown error so will quit')

            raise SystemExit

登入後複製

主函數起一個測試進程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

if name == 'main':

    while True:

        s = input('Input number list to test and any other word to quit\n')

        paras = []

        for para in s:

            if para.isnumeric():

                paras.append(int(para))

            else:

                break

        try:

            thread_test = Process(target=main_thread, args=(paras,))

            thread_test.start()

            thread_test.join(timeout=20)

        except TimeoutError as e:

            print('task timeout')

        except Exception as e:

            print('unknow error:',e)

登入後複製

1

  

登入後複製

結果驗證

#處理108,看列印可以看到,1被循環處理,0處理的時候報錯;8處理完畢則任務結束

Input number list to test and any other word to quit
108
continue for 1
start for 0 and wait 4s
start for 8 and wait 8s
continue for 1
continue for 1
continue for 1
error bcs  0
continue for 1
Pause bcs 0 will continue
continue for 1
continue for 1
continue for 1
continue for 1
stop for 8
Input number list to test and any other word to quit

以上是詳解python中Threadpool執行緒池任務終止範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
python - ubuntu16.04 lxml的報錯
來自於 1970-01-01 08:00:00
0
0
0
有辦法在PHP裡寫Python嗎?
來自於 1970-01-01 08:00:00
0
0
0
python scrapy爬蟲錯誤
來自於 1970-01-01 08:00:00
0
0
0
python相關問題求解決,有償
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板