python多程序和多執行緒

2022-05-17 06:01:30 字數 2916 閱讀 5002

多工才有多程序和執行緒:

執行緒是最小的執行單元,而程序由至少乙個執行緒組成。如何排程程序和執行緒,完全由作業系統決定,程式自己不能決定什麼時候執行,執行多長時間。

多程序和多執行緒的程式涉及到同步、資料共享的問題,編寫起來更複雜。

子程序永遠返回0,而父程序返回子程序的id。這樣做的理由是,乙個父程序可以fork出很多子程序,所以,父程序要記下每個子程序的id,而子程序只需要呼叫getppid()就可以拿到父程序的id。

1.fock()只在linux/unix下可以使用os.fork()

2.multiprocessing:

from multiprocessing import process

import os

def run_proc(name):

print('the child process no. is %s(%s)' % (name,os.getpid()))

if __name__=='__main__':

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

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

p.start()

p.join()

print('end')

如果要啟動大量的子程序,可以用程序池的方式批量建立子程序:

很多時候,子程序並不是自身,而是乙個外部程序。我們建立了子程序後,還需要控制子程序的輸入和輸出。

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

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

import subprocess

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)

5. 程序間通訊

from multiprocessing import process,queue

import os,time,random

# def write(q):

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

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

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

# q.put(value)

# time.sleep(random.random())

def write(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())

# def read(q):

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

# while true:

# value = q.get(true)

# print('get %s from queue!' %value)

def read(q):

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

while true:

value = q.get(true)

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

if __name__=='__main__':

q = queue()

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

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

pw.start()

# dddddddddddd

pr.start()

pw.join()

pr.terminate()

小結:1.linux和unix 可以使用fock()呼叫多程序

2.多作業系統通用的,可以用multiprocessing模組中的process(target =函式,args(name,)),pool,subprocess

3.程序間通訊可以通過queue、pipes

多執行緒:

多執行緒程式設計,模型複雜,容易發生衝突,必須用鎖加以隔離,同時,又要小心死鎖的發生。

lock = threading.lock()

t = threading.thread(targat = func,args=(n,))

python直譯器由於設計時有gil全域性鎖,導致了多執行緒無法利用多核。多執行緒的併發在python中就是乙個美麗的夢。

python 多執行緒 和 多程序

單執行緒例子 usr bin python coding utf 8 name danxiancheng.py import time import threading def loop num,sec print loop s start num,time.strftime y m d h m s...

python多執行緒和多程序

pool 感謝多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響 而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。python中,多執行...

多程序和多執行緒python

coding utf8 import threading import time class mop floor threading.thread def init self super mop floor,self init def run self print 我要拖地了 time.sleep ...