爬蟲——線程進程

  • 2020 年 1 月 19 日
  • 筆記

進程

使用

  • 導入類庫
import multiprocessing
  • 創建進程
p1 = multiprocessing.Process(target=test1) 

Process參數:group=None,target=None, name=None, args=(), kwargs={})

  • 全局變量
import time, os  import multiprocessing    nums = [11, 22, 33]    def test():      nums.append(44)      print('在進程1中nums=%s' % str(nums),id(nums))      time.sleep(3)    def test2():      print('在進程2中nums=%s' % str(nums),id(nums))    def main():      print('----in 主進程 pid=%d----父進程pid=%d----' % (os.getpid(), os.getppid()))      p = multiprocessing.Process(target=test)      p.start()        p2 = multiprocessing.Process(target=test2)      p2.start()      # test()      # test2()    if __name__ == '__main__':      main()

進程間全局變量不共享,因為進程是複製出來的

線程

使用

  • 導入類庫
import threading
  • 創建線程
t1 = threading.Thread(target=test1,args=(1000000,))

Thread參數:group=None,target=None, name=None,args=(), kwargs=None, *, daemon=None

  • 全局變量
import time,threading    g_num = 0  mutex = threading.Lock()    def test1(num):      global g_num      # mutex.acquire()      for i in range(num):          mutex.acquire()          g_num += 1          mutex.release()      # mutex.release()      print('-------in test1 g_num=%d-----' % g_num)    def test2(num):      global g_num      # mutex.acquire()      for i in range(num):          mutex.acquire()          g_num += 1          mutex.release()      # mutex.release()      print('-------in test2 g_num=%d-----' % g_num)    def main():      t1 = threading.Thread(target=test1,args=(1000000,))      t2 = threading.Thread(target=test2,args=(1000000,))      t1.start()      t2.start()      time.sleep(3)      print('-------------in main Thread g_num = %d----' % g_num)    if __name__ == '__main__':      main()

臨界區,在同一時間只有一個程序進入代碼塊執行,一般括住改變的地方

如果其他線程調用acquire,當前線程則進入等待

threading.RLock() 遞歸鎖 threading.Condition 信號量或條件鎖

  • 生產者消費者模式

生產者消費者模式是線程間通信的一種應用

在使用數據結構的時候確定是否是線程安全,Queue本身是線程安全的,列表list([])、字典dic({})都不是線程安全的

def set_value(q):      index = 0      while True:          q.put(index)          index += 1          q.put(index)          index += 1          time.sleep(2)    def get_value(q):      while True:          print('消費者獲取數據:',q.get())   #若隊列為空就sleep休眠,直到隊列有數據    def main():      q = Queue(4)      t1 = threading.Thread(target=set_value,args=[q])      t2 = threading.Thread(target=get_value,args=[q])      t1.start()      t2.start()