python如何控制程序或者執行緒的個數

2022-09-26 12:24:26 字數 3026 閱讀 3224

背景

日常開發中,難免遇到併發場景,而併發場景難免需要做流量控制,即需要對併發的程序或者執行緒的總量進行控制。 今天簡單總結兩種常用的控制線程個數的方法。

方法一:程序池/執行緒池

如下例demo所示, 建立了乙個大小是4的程序池,然後建立5個程序,並啟動

from multiprocessing import pool

import os, time, random

def long_time_task(name):

print('run task %s (%s)...' % (name, os.getpid()))

start = time.time()

time.sleep(random.random() * 3)

end = time.time()

print('task %s runs %0.2f seconds.' % (name, (end - start)))

if __name__ == '__main__':

print('parent process %s.' % os.getpid())

p = pool(4)

for i in range(5):

p.apply_async(long_time_task, args=(i,))

print('waiting for all subprocesses done...')

p.close()

p.join()

print('all subprocesses done.')

執行結果如下,可以看到第5個程序會等池子裡的程序完成乙個後才會被啟動

run task 0 (32952)...

run task 1 (32951)...

run task 2 (32953)...

run task 3 (32954程式設計客棧)...

task 2 runs 0.68 seconds.

run task 4 (32953)...

task 1 runs 1.41 seconds.

task 0 runs 1.44 seconds.

task 4 runs 2.15 seconds.

task 3 runs 2.98 seconds.

all subprocesses done.

方法二:queue

queue 模組即佇列,特別適合處理資訊在多個執行緒間安全交換的多執行緒程式中。 下面的demo展示了如何通過queue來限制執行緒的併發個數

import threading

import queue

import time

import random

import os

maxthreads = 4

class store(threading.thread):

def __init__(self, q):

threading.thread.__init__(self)

self.queue = q

# self.store = store

def run(self):

try:

print('run task (%s)...' %kbfvnn (os.getpid()))

start = time.time()

time.sleep(random.random() * 3)

end = time.time()

t = threading.currentthread()

# 執行緒id

print('thread id : %d' % t.ident)

prinkbfvnnt('thre name : %s' % t.getname())

print('task runs %0.2f seconds.' % (end - start))

except exception as e:

print(e)

finally:

self.queue.get()

self.queue.task_done()

def main():

q = queue.queue(maxthreads)

for s in range(6):

q.put(s)

t = store(q)

t.start()

q.join()

print('over')

if __name__ == '__main__':

main()

執行結果如下:

run task (33259)...

run task (33259)...

run task (33259)...

run task (33259)...

thread id : 123145444999168

thread name : thread-13

task runs 0.04 seconds.

run takbfvnnsk (33259)...

thread id : 123145394630656

thread name : thread-10

task runs 1.02 seconds.

run task (33259)...

thread id : 123145428209664

thread name : thread-12

task runs 1.20 seconds.

thread id : 123145394630656

thread name : thread-17

task runs 0.68 seconds.

thread id : 123145444999168

thread name : thread-14

task runs 1.79 seconds.

thread id : 123145411420160

thread name : thread-11

task runs 2.96 seconds.

over

聊聊swoole或者php cli 程序如何熱重啟

在討論這個話題之前,需要了解一下linux的訊號,在linux中發起乙個訊號最常用的函式莫過於kill了,如 kill sigusr1 pid kill 9 pid kill sigterm pid 等等。這些都屬於軟中斷 程序在收到這些訊號之後,預設的處理行為,就是不管三七二十一直接退出程序,這時...

如何使用多程序python

如何使用多程序 由於python中全域性解釋鎖 gil 的存在,在任意時刻只允許乙個執行緒在直譯器中執行,因此python的多執行緒不適合處理cpu密集型任務,想要處理cpu密集型任務,可以使用多程序模型 解決方案 使用標準庫中multiprocessing.process,它可以啟動子程序執行任務...

Linux上的C語言程序控制,父執行緒和子執行緒

1 程式設計寫程式實現 乙個程序產生子程序,1 子程序每隔5秒列印出 hello,i am child 共列印十次,十次列印完畢後輸出 child finished task 2 父程序每隔2秒鐘列印 hello,i am father 共列印5次,5次列印完畢後輸出 father finished...