背景
日常開發中,難免遇到併發場景,而併發場景難免需要做流量控制,即需要對併發的程序或者執行緒的總量進行控制。 今天簡單總結兩種常用的控制線程個數的方法。
方法一:程序池/執行緒池
如下例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...