1. 程式人生 > >python學習筆記 ---執行緒、程序、協程、佇列、python-memcache、python-redis

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-memcachepython-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中的多執行,多程序,多

程序 一個執行的程式(程式碼)就是一個程序,沒有執行的程式碼叫程式,程序是系統資源分配的最小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共享,開銷大。 執行緒, 排程執行的最小單位,也叫執行路徑,不能獨立存在,依賴程序存在一個程序至少有一個執行緒,叫主執行緒,而多

執行程序,非同步和同步,非阻塞IO

1.執行緒,程序,協程 程序定義:程序是具有一定獨立功能的程式在一個數據集上的一次動態執行的過程,是系統進行資源分配和排程的一個獨立單位 執行緒定義:執行緒是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 執行程序,攜

        同步就是指一個程序在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程序將會一直等待下去,直到收到返回資訊才繼續執行下去。         非同步是指程序不需要一直等下去,而是繼續執行下面的操作,不管其他程序的狀態。當有訊息返回時系統會通知進行處理,這樣可以提高執行的效率。