python學習筆記(六) 多程序

2021-08-22 08:26:39 字數 3508 閱讀 5246

依據廖雪峰官方**的python教程整理

import os

# 多程序

# unix/linux作業系統提供了乙個fork()系統呼叫,os.fork()封裝了fork系統呼叫,windows系統無法使用

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

pid = os.fork()

if pid == 0:

print('i am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))

else:

print('i (%s) just created a child process (%s).' % (os.getpid(), pid))

'''

from multiprocessing  import process

import os

# multiprocessing模組就是跨平台版本的多程序模組

# multiprocessing模組提供了乙個process類來代表乙個程序物件

# 子程序要執行的**

defrun_proc

(name):

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

if __name__=='__main__':

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

p = process(target=run_proc, args=('test',))

print('child process will start.')

# start()方法啟動子程序

p.start()

# join()方法可以等待子程序結束後再繼續往下執行,通常用於程序間的同步

p.join()

print('child process end.')

from multiprocessing import pool

import os, time, random

deflong_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):

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

# join()之前必須先呼叫close(), 之後就不能繼續新增新的process了

p.close()

# join()方法會等待所有子程序執行完畢

p.join()

print('all subprocesses done.')

import subprocess

# subprocess模組可以讓我們非常方便地啟動乙個子程序,然後控制其輸入和輸出

# 如果子程序還需要輸入,則可以通過communicate()方法輸入

print('$ nslookup')

p = subprocess.popen(['nslookup'], stdin=subprocess.pipe, stdout=subprocess.pipe, stderr=subprocess.pipe)

output, err = p.communicate(b'set q=mx\npython.org\nexit\n')

print(output.decode('gbk'))

print('exit code:', p.returncode)

from multiprocessing import process, queue

import os, time, random

# multiprocessing模組包裝了底層的機制,提供了queue、pipes等多種方式來交換資料

# 以queue為例,在父程序中建立兩個子程序,乙個往queue裡寫資料,乙個從queue裡讀資料

# 寫資料程序執行的**:

defwrite

(q):

print('process to write: %s' % os.getpid())

for value in ['a', 'b', 'c']:

print('put %s to queue...' % value)

q.put(value)

time.sleep(random.random())

# 讀資料程序執行的**:

defread

(q):

print('process to read: %s' % os.getpid())

while

true:

value = q.get(true)

print('get %s from queue.' % value)

if __name__ == '__main__':

# 父程序建立queue,並傳給各個子程序:

tq = queue()

pw = process(target=write, args=(tq,))

pr = process(target=read, args=(tq,))

# 啟動子程序pw,寫入:

pw.start()

# 啟動子程序pr,讀取:

pr.start()

# 等待pw結束:

pw.join()

# pr程序裡是死迴圈,無法等待其結束,只能強行終止:

pr.terminate()

# 在unix/linux下,multiprocessing模組封裝了fork()呼叫,使我們不需要關注fork()的細節。

# 由於windows沒有fork呼叫,因此,multiprocessing需要「模擬」出fork的效果,父程序所有python物件都必須通過pickle序列化再傳到子程序去,

# 如果multiprocessing在windows下呼叫失敗了,要先考慮是不是pickle失敗了。

更多更及時的部落格更新請戳—> kingrumn

Python學習筆記(六)多程序實現併發伺服器

這個相對於多程序更加簡單,每accept乙個新的連線就建立乙個新的執行緒。如下 coding utf 8 import socket import sysimport errno import threading from time import ctime class clientthread t...

Python 學習筆記 多程序爬蟲

前段時間學習了多執行緒,但在實際的情況中對於多執行緒的速度實在不滿意,所以今天就來學學多程序分布式爬蟲,在這裡感謝莫煩的python教程。在講述多程序之前,先來回顧一下之前學習的多執行緒。對於多執行緒可以簡單的理解成運輸快遞的貨車,雖然在整個運輸快遞的途中有很多貨車參與運輸,但快遞到你手中的時間並不...

python學習筆記之多程序

我們現代的作業系統,都是支援 多工 的作業系統,對於操程式設計客棧作系統來說,乙個任務就是乙個程序 process 比如開啟乙個瀏覽器就是啟動乙個瀏覽器程序。如果我們將計算器的核心cpu比喻為一座工廠,那麼程序就像工廠裡的車間,它代表cpu所能處理的單個任務。任一時刻,cpu總是執行乙個程序,其他程...