在之前一篇文章中 python使用多執行緒實現串列埠收發資料,提到了使用多執行緒實現串列埠收發資料,曉得多執行緒的朋友可能會有點疑問:多執行緒是單cpu,雖然在io中速度比較快,但是對於乙個大的專案,多執行緒本身是加速不了太多的;針對這個問題,我用multiprocessing改了一下**。
windows:
linux:
jeston nano/rraspberry pi:
**包括自定義通訊協議的部分,但是這裡receive()的判斷沒寫完。
**如下:
'''
通訊協議:
1-2:0x5a/0x5a/ring/task/power/0xb3
2-1:0x5a/0x5a/mark/result/0xb3
以上資料均為16進製制
'''import serial
import multiprocessing
import time
defreceive()
: serial_port = serial.serial(
port=
"com5"
, baudrate=
115200
, bytesize=serial.eightbits,
parity=serial.parity_none,
stopbits=serial.stopbits_one,
)# wait a second to let the port initialize
time.sleep(
0.5)
while
true
: tran_data1 =
ord(serial_port.read())
if tran_data1 ==90:
tran_data2 =
ord(serial_port.read())
if tran_data2 ==90:
ring =
ord(serial_port.read())
task =
ord(serial_port.read())
power =
ord(serial_port.read())
print
("data receive success!"
)def
send
(mark,result)
: serial_port = serial.serial(
port=
"com7"
, baudrate=
115200
, bytesize=serial.eightbits,
parity=serial.parity_none,
stopbits=serial.stopbits_one,
)# wait a second to let the port initialize
time.sleep(
0.5)
while
true
: data =
bytearray([
0x5a
,0x5a
, mark,result,
0xb3])
print
(data)
serial_port.write(data)
time.sleep(1)
if __name__ ==
'__main__'
: mark =
0 result =
1 p1 = multiprocessing.process(target=send,args=
[mark,result]
) p2 = multiprocessing.process(target=receive)
p1.start(
) p2.start(
) p1.join(
) p2.join(
)
note:
稍微仔細一點的朋友會發現,我這裡是用了com5
和com7
兩個埠,這樣用的原因是,多程序其實是兩個cpu(或者說兩個執行緒,這裡的執行緒指的是超執行緒技術將乙個cpu分成兩個),每個cpu都有自己的空間和運算能力,所以兩個cpu也不能同時呼叫乙個埠。
最後:
Python實現多程序
python可以實現多執行緒,但是因為global interpreter lock gil python的多執行緒只能使用乙個cpu核心,即乙個時間只有乙個執行緒在執行,多執行緒只是不同執行緒之間的切換,對多核cpu來說,就是巨大的浪費。如4核cpu,實際上只利用了乙個核,cpu利用率只有25 要...
python 實現多程序
方法一 from urllib import request from multiprocessing import process import os def url,kwargs print 當前程序id os.getpid os.getppid os.getpid 獲取當前程序id,os.ge...
python使用多程序
python多執行緒適合io密集型場景,而在cpu密集型場景,並不能充分利用多核cpu,而協程本質基於執行緒,同樣不能充分發揮多核的優勢。針對計算密集型場景需要使用多程序,python的multiprocessing與threading模組非常相似,支援用程序池的方式批量建立子程序。只需要例項化pr...