依據廖雪峰官方**的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總是執行乙個程序,其他程...