python學習筆記 ---執行緒、程序、協程、佇列、python-memcache、python-redis
一、執行緒
Threading用於提供執行緒相關的操作,執行緒是應用程式中工作的最小單元。
#!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def show(arg): time.sleep(1) print 'thread'+str(arg) for i in range(10): t = threading.Thread(target=show, args=(i,)) t.start() print 'main thread stop'
上述程式碼建立了10個“前臺”執行緒,然後控制器就交給了CPU,CPU根據指定演算法進行排程,分片執行指令。
更多方法:
- start 執行緒準備就緒,等待CPU排程
- setName 為執行緒設定名稱
- getName 獲取執行緒名稱
- setDaemon 設定為後臺執行緒或前臺執行緒(預設)
如果是後臺執行緒,主執行緒執行過程中,後臺執行緒也在進行,主執行緒執行完畢後,後臺執行緒不論成功與否,均停止
如果是前臺執行緒,主執行緒執行過程中,前臺執行緒也在進行,主執行緒執行完畢後,等待前臺執行緒也執行完成後,程式停止 - join 逐個執行每個執行緒,執行完畢後繼續往下執行,該方法使得多執行緒變得無意義
- run 執行緒被cpu排程後自動執行執行緒物件的run方法
import threading import time class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) self.num = num def run(self):#定義每個執行緒要執行的函式 print("running on number:%s" %self.num) time.sleep(3) if __name__ == '__main__': t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start()
執行緒鎖(Lock、RLock)
由於執行緒之間是進行隨機排程,並且每個執行緒可能只執行n條執行之後,當多個執行緒同時修改同一條資料時可能會出現髒資料,所以,出現了執行緒鎖 - 同一時刻允許一個執行緒執行操作。
#!/usr/bin/env python #-*-coding:utf-8-*- import threading import time NUM=10 def func(i,l): global NUM #上鎖 l.acquire() NUM -= 1 time.sleep(5) print(NUM) #開鎖 l.release() #lock=threading.Lock() # lock=threading.RLock() lock=threading.BoundedSemaphore(5) for i in range(10): # t=threading.Thread(target=func,args=(lock,)) t=threading.Thread(target=func,args=(i,lock,)) t.start()
#!/usr/bin/env python #-*-coding:utf-8-*- import threading def func(i,e): print(i) e.wait()#檢測是什麼燈, print(i+100) event=threading.Event() for i in range(10): t=threading.Thread(target=func,args=(i,event,)) t.start() #-------------- event.clear()#設定成紅燈 inp=input('>>>') if inp == "1": event.set()#設定成綠燈
#!/usr/bin/env python #-*-coding:utf-8-*- #第一種 import threading def condition(): ret = False r = input('>>>') if r == 'true': ret = True else: ret = False return ret def func(i,con): print(i) con.acquire() con.wait_for(condition) print(i+100) con.release() c = threading.Condition() for i in range(10): t = threading.Thread(target=func, args=(i,c,)) t.start() #第二種 import threading def func(i,con): print(i) con.acquire() con.wait() print(i+100) con.release() c = threading.Condition() for i in range(10): t = threading.Thread(target=func, args=(i,c,)) t.start() while True: inp = input('>>>') if inp == 'q': break c.acquire() c.notify(int(inp)) c.release() from threading import Timer def hello(): print("hello, world") t = Timer(1, hello) t.start() # after 1 seconds, "hello, world" will be printed
#互斥鎖 同時只允許一個執行緒更改資料,而Semaphore是同時允許一定數量的執行緒更改資料 ,比如廁所有3個坑,那最多隻允許3個人上廁所,後面的人只能等裡面有人出來了才能再進去。 import threading,time def run(n): semaphore.acquire() time.sleep(1) print("run the thread: %s" %n) semaphore.release() if __name__ == '__main__': num= 0 semaphore = threading.BoundedSemaphore(5) #最多允許5個執行緒同時執行 for i in range(20): t = threading.Thread(target=run,args=(i,)) t.start()
二、程序
1 2 3 4 5 6 7 8 9 10 |
from
multiprocessing import
Process
import
threading
import
time
def
foo(i):
print
'say hi' ,i
for
i in range ( 10 ):
p
= Process(target = foo,args = (i,))
p.start()
|
注意:由於程序之間的資料需要各自持有一份,所以建立程序需要的非常大的開銷。
程序間的資料共享
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#!/usr/bin/env python
#-*-coding:utf-8-*-
#第一種multiprocessing,queues
# from multiprocessing import Process
# from multiprocessing import queues
# import multiprocessing
#
# def foo(i,arg):
# arg.put(i)
# print('say hi',i,arg.qsize())
#
# if __name__=='__main__':
# li = queues.Queue(20,ctx=multiprocessing)
# for i in range(10):
# p = Process(target=foo,args=(i,li,))
# p.start()
#第二種Array
# from multiprocessing import Process
# from multiprocessing import queues
# import multiprocessing
# from multiprocessing import Array
# def foo(i,arg):
# arg[i]=i+100
# for item in arg:
# print(item)
# print('==========')
# if __name__=='__main__':
# li=Array('i',10)
# for i in range(10):
# p=Process(target=foo,args=(i,li,))
# p.start()
#第三種
from
multiprocessing import
Process
from
multiprocessing import
queues
import
multiprocessing
from
multiprocessing import
Manager
def
foo(i,arg):
# arg.put(i)
# print('say hi',i,arg.qsize())
# arg[i] = i + 100
# for item in arg:
# print(item)
# print('==========')
arg[i]
= i
+ 100
print (arg.values())
if
__name__ = =
'__main__' :
#li = []
#li = queues.Queue(20,ctx=multiprocessing)
obj
= Manager()
li
= obj. dict ()
#li = Array('i',10)
for
i in
range ( 10 ):
p
= Process(target = foo,args = (i,li,))
#p.daemon = True
p.start()
#p.join()
import
time
time.sleep( 0.1 )
|
'c': ctypes.c_char, 'u': ctypes.c_wchar, 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, 'h': ctypes.c_short, 'H': ctypes.c_ushort, 'i': ctypes.c_int, 'I': ctypes.c_uint, 'l': ctypes.c_long, 'L': ctypes.c_ulong, 'f': ctypes.c_float, 'd': ctypes.c_double
程序鎖例項:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from
multiprocessing import
Process, Array, RLock
def
Foo(lock,temp,i):
"""
將第0個數加100
"""
lock.acquire()
temp[ 0 ]
= 100 + i
for
item in
temp:
print
i, '----->' ,item
lock.release()
lock =
RLock()
temp =
Array( 'i' , [ 11 ,
22 , 33 ,
44 ])
for
i in range ( 20 ):
p
= Process(target = Foo,args = (lock,temp,i,))
p.start()
|
程序池
程序池內部維護一個程序序列,當使用時,則去程序池中獲取一個程序,如果程序池序列中沒有可供使用的進程序,那麼程式就會等待,直到程序池中有可用程序為止。
程序池中有兩個方法:
- apply
- apply_async
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from
multiprocessing import
Process,Pool
import
time
def
Foo(i):
time.sleep( 2 )
return
i + 100
def
Bar(arg):
print
arg
pool =
Pool( 5 )
#print pool.apply(Foo,(1,))
#print pool.apply_async(func =Foo, args=(1,)).get()
for
i in range ( 10 ):
pool.apply_async(func = Foo, args = (i,),callback = Bar)
print
'end'
pool.close()
pool.join() #程序池中程序執行完畢後再關閉,如果註釋,那麼程式直接關閉。
|
三、協程
執行緒和程序的操作是由程式觸發系統介面,最後的執行者是系統;協程的操作則是程式設計師。
協程存在的意義:對於多執行緒應用,CPU通過切片的方式來切換執行緒間的執行,執行緒切換時需要耗時(儲存狀態,下次繼續)。協程,則只使用一個執行緒,在一個執行緒中規定某個程式碼塊執行順序。
協程的適用場景:當程式中存在大量不需要CPU的操作時(IO),適用於協程;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from
greenlet import
greenlet
def
test1():
print
12
gr2.switch()
print
34
gr2.switch()
def
test2():
print
56
gr1.switch()
print
78
gr1 =
greenlet(test1)
gr2 =
greenlet(test2)
gr1.switch()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import
gevent
def
foo():
print ( 'Running in foo' )
gevent.sleep( 0 )
print ( 'Explicit context switch to foo again' )
def
bar():
print ( 'Explicit context to bar' )
gevent.sleep( 0 )
print ( 'Implicit context switch back to bar' )
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
|
四、佇列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#!/usr/bin/env python
#-*-coding:utf-8-*-
import
queue,time
#先進先出佇列
#put放資料,是否阻塞,阻塞時的超時時間
#get取資料(預設阻塞),是否阻塞,阻塞時的超時時間
#佇列最大長度
#qsize()真是個數
#maxsize最大支援個數
#join,task_done,阻塞程序,當佇列中的任務執行完畢後,不再阻塞
# q=queue.Queue(2)
# print(q.empty())#判斷佇列有沒有元素,有返回True
# q.put(11)
# q.put(22)
# print(q.empty())
# print(q.qsize())
# q.put(22)
# q.put(33,block=False)
# q.put(33,block=False,timeout=2)
# print(q.get())
# print(q.get())
# print(q.get(timeout=2))
import
queue #先進先出
# q = queue.LifoQueue()
# q.put(123)
# q.put(456)
# print(q.get())
# q = queue.PriorityQueue() #根據優先順序處理
# q.put((1,"alex1"))
# q.put((2,"alex2"))
# q.put((3,"alex3"))
# print(q.get())
# q= queue.deque() #雙向佇列
# q.append((123))
# q.append(234)
# q.appendleft(456)
# print(q.pop())
# print(q.popleft())
# q=queue.Queue(5)
# q.put(123)
# q.put(456)
# q.get()
# q.task_done()
# q.get()
# time.sleep(5)
# q.task_done()
# q.join()
|
五、python-memcache
Memcached安裝,使用:
wget http: / / memcached.org / latest
tar - zxvf memcached - 1.x .x.tar.gz
cd memcached - 1.x .x
. / configure && make && make test && sudo make install
PS:依賴libevent
yum install libevent - devel
apt - get install libevent - dev
啟動memcache
memcached
- d - m
10 - u root
- l 10.211 . 55.4
- p 12000
- c 256
- P / tmp / memcached.pid
引數說明:
- d 是啟動一個守護程序
- m 是分配給Memcache使用的記憶體數量,單位是MB
- u 是執行Memcache的使用者
- l 是監聽的伺服器IP地址
- p 是設定Memcache監聽的埠,最好是 1024 以上的埠
- c 選項是最大執行的併發連線數,預設是 1024 ,按照你伺服器的負載量來設定
- P 是設定儲存Memcache的pid檔案
命令
儲存命令: set / add / replace / append / prepend / cas
獲取命令: get / gets
其他命令: delete / stats..
python
- m pip install python - memcache
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
相關推薦python學習筆記 ---執行緒、程序、協程、佇列、python-memcache、python-redis一、執行緒 Threading用於提供執行緒相關的操作,執行緒是應用程式中工作的最小單元。 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time def show(arg): time. Python學習筆記--執行緒鎖如果你想啟動python的多執行緒對一個數據進行累加的操作,如果在py2上你多執行幾次會發現少加了。原因是如果某個執行緒拿到公共資料477時,該執行緒就會申請一個gil lock,python直譯器 理解一下Python中的多執行緒,多程序,多協程程序 一個執行的程式(程式碼)就是一個程序,沒有執行的程式碼叫程式,程序是系統資源分配的最小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共享,開銷大。 執行緒, 排程執行的最小單位,也叫執行路徑,不能獨立存在,依賴程序存在一個程序至少有一個執行緒,叫主執行緒,而多 執行緒,程序,協程,非同步和同步,非阻塞IO1.執行緒,程序,協程 程序定義:程序是具有一定獨立功能的程式在一個數據集上的一次動態執行的過程,是系統進行資源分配和排程的一個獨立單位 執行緒定義:執行緒是CPU排程和分派的基本單位,是比程序更小能獨立執行的單位,執行緒佔有系統。但是它可以與它同屬的程序和其他在該程序中的執行緒共享 簡析作業系統執行緒,程序和協程一、概念 1、程序 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。每個程序都有自己的獨立記憶體空間,不同程序通過程序間通訊來通訊。由於程序比較重量,佔據獨立的記憶體,所以上下文程序間的切換開銷( 一句話介紹python執行緒、程序和協程一、程序: Python的os模組封裝了常見的系統呼叫,其中就包括fork。而fork是linux常用的產生子程序的方法,簡言之是一個呼叫,兩個返回。 在python中,以下的兩個模組用於程序的使用。詳細就不展開。 multiprocessing:跨平臺版本的多程序模組。 Pool:程序池 Queu Linux 學習筆記—執行緒同步之讀寫鎖、自旋鎖、屏障3.2.1 讀寫鎖 讀寫鎖和互斥體類似,不過讀寫鎖有更高的並行性,互斥體要麼是鎖住狀態,要麼是不加鎖狀態,而且一次只有一個執行緒可以對其加鎖。而讀寫鎖可以有3個狀態,讀模式下鎖住狀態,寫模式下鎖住狀態,不加鎖狀態。一次只有一個執行緒可以佔有寫模式的讀寫鎖,但是多 Python之旅12:執行緒、程序和協程本章內容: 執行緒(執行緒鎖、threading.Event、queue 佇列、生產者消費者模型、自定義執行緒池) 程序(資料共享、程序池) 協程 概念: 1、程序:本質上就是一段程式的執行過程(抽象概念) 2、執行緒:最小的執行單元 3、程序:最小的資源單 5.Python學習筆記:綜合練習[購物車程序]phone python IV 技術分享 pri pen user code 練習 salary=5000 flag=True user_buy1=[] msg=‘‘‘ --------歡迎光臨----------- salary=5000 1.iphon python中的多程序,多執行緒,死鎖,多協程本人根據自己的理解來總結的,如果有錯誤的地方還請各位大佬指正,謝謝了. 程序:程式是計算機可執行的二進位制資料,只有被作業系統呼叫的時候才開始它們的生命週期.程序就是程式的一次執行,擁有自己的地址空間,記憶體,程序id(pid),資料棧及其他記錄其執行軌跡的輔助資料;最小的 python之多執行緒多程序併發通訊1.獨立的程序記憶體空間與共享的伺服器程序空間 程序之間是:互不干擾的獨立記憶體空間 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : Linux 學習筆記—執行緒間通訊的概念和執行緒控制函式1 執行緒間通訊 執行緒間無需特別的手段進行通訊,由於執行緒間能夠共享資料結構,也就是一個全域性變數能夠被兩個執行緒同一時候使用。只是要注意的是執行緒間須要做好同步,一般用mutex。執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程序通訊中的用於資料交 Linux 學習筆記—執行緒同步之互斥量與條件變數執行緒同步(同步的意思是協同步調) 執行緒同步機制包括互斥,讀寫鎖以及條件變數等 3.2.1 互斥量(互斥鎖) **互斥量本質是一把鎖,在訪問公共資源前對互斥量設定(加鎖),確保同一時間只有一個執行緒訪問資料,在訪問完成後再釋放(解鎖)互斥量。**在互斥量加鎖之 Python學習筆記24:多程序#多程序——程序間通訊(IPC:InterProcessCommunication)——程序之間無任何共享狀態 import multiprocessingfrom time import sleep, ctimeclass ClockProcess(multiprocessing.Process): TBSchedule原始碼學習筆記-執行緒組任務排程根據上文的啟動過程,找到了執行緒組的實現。com.taobao.pamirs.schedule.taskmanager.TBScheduleManager /** * 1、任務排程分配器的目標: 讓所有的任務不重複,不遺漏的被快速處理。 * 2、 python之《執行緒與程序》執行緒:是作業系統最小的排程單位,是一串指令的集合 程序:eg:QQ要以一個整體的形式暴露給作業系統管理,裡面包含對各種資源的呼叫,記憶體對各種資源管理的集合叫做程序 程序操作cpu必須先建立一個執行緒,只有執行緒才能操作cpu 所一在同一程序中的執行緒是共享同一片記憶體空間的,但是兩個執行緒不能在同一 APUE 學習筆記——執行緒控制第12章 執行緒控制 1. 執行緒屬性 執行緒屬性結構體:pthread_arrr_t int pthread_attr_init(pthread_attr_t *attr); //初始化執行緒屬性 int pthread_attr_destroy(pthread_a C++11學習筆記-----執行緒庫std::thread在以前,要想在C++程式中使用執行緒,需要呼叫作業系統提供的執行緒庫,比如linux下的<pthread.h>。但畢竟是底層的C函式庫,沒有什麼抽象封裝可言,僅僅透露著一種簡單,暴力美 C++11在語言級別上提供了執行緒的支援,不考慮效能的情況下可 多執行緒程式設計學習筆記——執行緒同步(三)using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引入執行緒 using System.Diagnostics; namesp python 執行緒,程序,攜程同步就是指一個程序在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程序將會一直等待下去,直到收到返回資訊才繼續執行下去。 非同步是指程序不需要一直等下去,而是繼續執行下面的操作,不管其他程序的狀態。當有訊息返回時系統會通知進行處理,這樣可以提高執行的效率。 |