包含python的攜程使用以及通信的詞條

本文目錄一覽:

python基礎(21)-線程通信

到這裡,我們要聊一下線程通信的內容;

首先,我們拋開語言不談,先看看比較基礎的東西,線程間通信的方式;其實也就是哪幾種(我這裡說的,是我的所謂的知道的。。。)事件,消息隊列,信號量,條件變數(鎖算不算?我只是認為是同步的一種);所以我們也就是要把這些掌握了,因為各有各的好處嘛;

條件變數我放到了上面的線程同步裡面講了,我總感覺這算是同步的一種,沒有很多具體信息的溝通;同時吧,我認為條件變數比較重要,因為這種可以應用於線程池的操作上;所以比較重要;這裡,拋開條件變數不談,我們看看其他的東西;

1、消息隊列:

queue 模塊下提供了幾個阻塞隊列,這些隊列主要用於實現線程通信。在 queue 模塊下主要提供了三個類,分別代表三種隊列,它們的主要區別就在於進隊列、出隊列的不同。

關於這三個隊列類的簡單介紹如下:

queue.Queue(maxsize=0):代表 FIFO(先進先出)的常規隊列,maxsize 可以限制隊列的大小。如果隊列的大小達到隊列的上限,就會加鎖,再次加入元素時就會被阻塞,直到隊列中的元素被消費。如果將 maxsize 設置為 0 或負數,則該隊列的大小就是無限制的。

queue.LifoQueue(maxsize=0):代表 LIFO(後進先出)的隊列,與 Queue 的區別就是出隊列的順序不同。

PriorityQueue(maxsize=0):代表優先順序隊列,優先順序最小的元素先出隊列。

這三個隊列類的屬性和方法基本相同, 它們都提供了如下屬性和方法:

Queue.qsize():返回隊列的實際大小,也就是該隊列中包含幾個元素。

Queue.empty():判斷隊列是否為空。

Queue.full():判斷隊列是否已滿。

Queue.put(item, block=True, timeout=None):向隊列中放入元素。如果隊列己滿,且 block 參數為 True(阻塞),當前線程被阻塞,timeout 指定阻塞時間,如果將 timeout 設置為 None,則代表一直阻塞,直到該隊列的元素被消費;如果隊列己滿,且 block 參數為 False(不阻塞),則直接引發 queue.FULL 異常。

Queue.put_nowait(item):向隊列中放入元素,不阻塞。相當於在上一個方法中將 block 參數設置為 False。

Queue.get(item, block=True, timeout=None):從隊列中取出元素(消費元素)。如果隊列已滿,且 block 參數為 True(阻塞),當前線程被阻塞,timeout 指定阻塞時間,如果將 timeout 設置為 None,則代表一直阻塞,直到有元素被放入隊列中; 如果隊列己空,且 block 參數為 False(不阻塞),則直接引發 queue.EMPTY 異常。

Queue.get_nowait(item):從隊列中取出元素,不阻塞。相當於在上一個方法中將 block 參數設置為 False。

其實我們想想,這個隊列,是python進行封裝的,那麼我們可以用在線程間的通信;同時也是可以用做一個數據結構;先進先出就是隊列,後進先出就是棧;我們用這個棧寫個十進位轉二進位的例子:

沒毛病,可以正常的列印;其中需要注意的就是,maxsize在初始化的時候如果是0或者是個負數的話,那麼就會是不限制大小;

那麼其實我們想想,我們如果用做線程通信的話,我們兩個線程,可以把隊列設置為1的大小,如果是1對多,比如是創建者和消費者的關係,我們完全可以作為消息隊列,比如說創建者一直在創建一些東西,然後放入到消息隊列裡面,然後供消費著使用;就是一個很好的例子;所以,其實說是消息隊列,也就是隊列,沒差;

=====================================================================

下面來看一下事件

Event 是一種非常簡單的線程通信機制,一個線程發出一個 Event,另一個線程可通過該 Event 被觸發。

Event 本身管理一個內部旗標,程序可以通過 Event 的 set() 方法將該旗標設置為 True,也可以調用 clear() 方法將該旗標設置為 False。程序可以調用 wait() 方法來阻塞當前線程,直到 Event 的內部旗標被設置為 True。

Event 提供了如下方法:

is_set():該方法返回 Event 的內部旗標是否為True。

set():該方法將會把 Event 的內部旗標設置為 True,並喚醒所有處於等待狀態的線程。

clear():該方法將 Event 的內部旗標設置為 False,通常接下來會調用 wait() 方法來阻塞當前線程。

wait(timeout=None):該方法會阻塞當前線程。

這裡我想解釋一下;其實對於事件來說,事件可以看成和條件變數是一樣的,只是我們說說不一樣的地方;

1、對於事件來說,一旦觸發了事件,也就是說,一旦set為true了,那麼就會一直為true,需要clear調內部的標誌,才能繼續wait;但是conditon不是,他是一次性的喚醒其他線程;

2、conditon自己帶鎖;事件呢?不是的;沒有自己的鎖;比如說有一個存錢的線程,有一個是取錢的線程;那麼存錢的線程要存錢;需要怎麼辦呢?1、發現銀行沒有錢了(is_set判斷);2、鎖住銀行;3、存錢;4、釋放銀行;5、喚醒事件;對於取錢的人;1、判斷是否有錢;2、被喚醒了,然後鎖住銀行;3、開始取錢;4、清理告訴存錢的人,我沒錢了(clear);5、釋放鎖;6、等著錢存進去;

其實說白了,就是記住一點;這個旗標需要自己clear就對了

寫個例子,怕以後忘了怎麼用;

其實時間和信號量比較像;但是信號量不用自己清除標誌位;但是事件是需要的;

用python 怎麼和硬體進行鏈接,通信,交互?

本文介紹了用python與文件進行交互的方法,分享給大家,具體如下:

一.文件處理

1.介紹

計算機系統:計算機硬體,操作系統,應用程序

應用程序無法直接操作硬體,通過操作系統來操作文件,進而讀/寫硬體中的文件。

python打開文件過程:

#打開

f=open(‘a.txt’,’r’)

#通過句柄對文件進行操作

read_f=f.read()

#關閉文件

f.close()

with open(‘a.txt’,’r’) as f: #不需要關閉

f.close() #回收操作系統打開的文件

del f #回收應用程序級的變數

2.打開文件的模式

a.打開文本文件

#r,只讀模式【默認模式,文件必須存在,不存在則拋出異常】

f=open(‘a.txt’,encoding=’utf-8′)

data1=f.read()

print(f.readline(),end=”)

print(f.readlines())

#w,只寫模式【不可讀;不存在則創建;存在則清空內容】

f=open(‘a.txt’,’w’,encoding=’utf-8′)

f.write(‘werf’)

#a,只追加寫模式【不可讀;不存在則創建;存在則只追加內容】

f=open(‘a.txt’,’a’,encoding=’utf-8′)

f.write(‘werf\n’)

b.對於非文本文件,只能使用b模式,”b”表示以位元組的方式操作(而所有文件也都是以位元組的形式存儲的,使用這種模式無需考慮文本文件的字元編碼、圖片文件的jgp格式、視頻文件的avi格式

with open(‘1.jpg’,’rb’) as f_read:

data=f_read.read()

print(data)

with open(‘a.txt’,’rb’) as f_read:

data=f_read.read().decode(‘utf-8’) #解碼

print(data)

with open(‘a.txt’,’wb’)as f_write:

f_write.write(‘adsf’.encode(‘utf-8’))

”’

練習,利用b模式,編寫一個cp工具,要求如下:

1. 既可以拷貝文本又可以拷貝視頻,圖片等文件

2. 用戶一旦參數錯誤,列印命令的正確使用方法,如usage: cp source_file target_file

”’

import sys

if len(sys.argv)!=3:

print(‘usage:cp source_file target_file’)

sys.exit()

source_file,target_file=sys.argv[1],sys.argv[2]

print()

with open(source_file,’rb’)as f_read,open(target_file,’wb’)as f_write:

for line in f_read:

f_write.write(line)

3.文件內游標的移動

#以文本模式讀文件,n代表的是字元的個數

with open(‘a.txt’,’r’)as f_read:

data=f_read.read(6)

print(data)

#以b模式讀文件,n代表的是位元組的個數

with open(‘a.txt’,’rb’)as f_read:

data=f_read.read(6)

print(data)

# tell:告訴當前游標的位置

with open(‘a.txt’,’r’,encoding=’utf-8′)as f_read:

data=f_read.read(4)

data1=f_read.tell()

print(data,data1)

# seek:移動游標(0:文件開頭默認;1:文件當前游標;2:文件末尾)

with open(‘a.txt’, ‘r’, encoding=’utf-8′)as f_read:

data = f_read.seek(3)

data1 = f_read.read()

print(data, data1)

# 實現tail功能

import time

with open(‘access.log’, ‘rb’)as f_read:

f_read.seek(0,2)

while True:

line = f_read.readline()

if line:

print(line.decode(‘utf-8’),end=”)

else:

time.sleep(1)

4.文件的修改

import os

with open(‘a.txt’) as read_f,open(‘.a.txt.swap’,’w’) as write_f:

for line in read_f:

line=line.replace(‘alex’,’SB’)

write_f.write(line)

os.remove(‘a.txt’)

os.rename(‘.a.txt.swap’,’a.txt’)

Linux平台下python中有什麼方法可以與一個進程通信

本文實例講解了python實現兩個程序之間通信的方法,具體方法如下:

該實例採用socket實現,與socket網路編程不一樣的是socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)的第一個參數是socket.AF_UNIX

而不是 socket.AF_INET

例中兩個python程序 s.py/c.py 要先運行s.py

基於fedora13/python2.6測試,成功實現!

s.py代碼如下:

#!/usr/bin/env python

import socket

import os

if __name__ == ‘__main__’:

sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

conn = ‘/tmp/conn’

if not os.path.exists(conn):

os.mknod(conn)

if os.path.exists(conn):

os.unlink(conn)

sock.bind(conn)

sock.listen(5)

while True:

connection,address = sock.accept()

data = connection.recv(1024)

if data == “hello,server”:

print “the client said:%s!\n” % data

connection.send(“hello,client”)

connection.close()

c.py代碼如下:

#!/usr/bin/env python

import socket

import time

if __name__ == ‘__main__’:

sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

conn = ‘/tmp/conn’

sock.connect(conn)

time.sleep(1)

sock.send(‘hello,server’)

print sock.recv(1024)

sock.close()

python線程間通信的問題,回答有加分!300

pyqt的線程之間的通信是通過信號to槽來實現的,首先你在線程類裡面聲明一個全局槽比如:

class imThread(QtCore.QThread):

    imslot = QtCore.pyqtSignal()

這裡是要重點注意,上面的是沒有任何參數的一個信號,如果你需要參數的話,你可以在裡面添加參數類型,例如:

imslot1 = QtCore.pyqtSignal(str)    #這是一個帶字元串參數的信號

imslot2 = QtCore.pyqtSignal(int)    #這是一個帶整型參數的信號

imslot3 = QtCore.pyqtSignal(bool)   #這是一個帶布爾參數的信號

當然了,如果你需要多個參數的話,同樣地往裡面加就是了,qt也沒有要求參數必須是同類型的,所以可以這樣:

imslot1 = QtCore.pyqtSignal(str, int)    #這是一個帶整型和字元串的參數信號

imslot2 = QtCore.pyqtSignal(int, str, str)    #這是一個帶整型和兩個字元串的參數信號

imslot3 = QtCore.pyqtSignal(bool, str) #這是一個帶布爾和字元串的參數信號

在線程的run方法裡面來定義執行信號:

self.imslot.emit()

這裡也是需要重點注意的是,上面這個介面是沒有參數的,如果你是要參數的話,是需要這樣寫:

self.imslot1[str].emit(‘hello’)

self.imslot2[int].emit(1)

self.imslot3[bool].emit(False)

多參數的是這樣

self.imslot1[str, int].emit(‘hello’, 1)

self.imslot2[int, str, str].emit(1, “hello”, “world”)

self.imslot3[bool, str].emit(False, ‘hello’)

以上就是在線程類裡面完成信號定義了,接下來就是邏輯層成定義一個函數槽來連接線程類裡面的信號,這個也很簡單,比如我在主線程類裡面定義一個方法:

def imSlot():

    print ‘ok’

以上這個是槽函數,接下來是實現信號槽的連接

imThread.imslot.connect(‘imSlot’)

這個就是信號槽的連接方式,當然了,這個是沒有參數的一個信號槽,那麼帶參數的怎麼寫呢?也很簡單!首先定義一個槽函數:

def imSlot(para):

    print para

這個是帶參數的槽函數,下面是:

imThread.imslot[str].connect(‘imSlot’)

以上就是線程之間的方法了,子線程在執行的通行經過執行信號的話,子線程可以安全地執行而不會出現GUI主線程卡死的情況了。

學會python能幹嘛 盤點python在這五個應用領域的作用

Python作為一種功能強大的編程語言,因其簡單易學而受到很多開發者的青睞。那麼,Python 的應用領域有哪些呢?概括起來,Python的應用領域主要有如下幾個,這也是學完python將要從事的相關工作。

1、Web應用開發:

Python經常被用於 Web 開發。例如,通過 mod_wsgi 模塊,Apache 可以運行用 Python 編寫的 Web 程序。Python 定義了 WSGI 標準應用介面來協調 HTTP 伺服器與基於 Python 的 Web 程序之間的通信。

不僅如此,一些 Web 框架(如 Django、TurboGears、web2py 等等)可以讓程序員輕鬆地開發和管理複雜的Web程序。

舉個最直觀的例子,全球最大的搜索引擎 Google,在其網路搜索系統中就廣泛使用 Python 語言。另外,我們經常訪問的集電影、讀書、音樂於一體的豆瓣網,也是使用 Python 實現的。

2、操作系統管理、自動化運維開發

很多操作系統中,Python 是標準的系統組件,大多數 Linux 發行版以及 NetBSD、OpenBSD 和 Mac OS X 都集成了 Python,可以在終端下直接運行 Python。

有一些 Linux 發行版的安裝器使用 Python 語言編寫,例如 Ubuntu 的 Ubiquity 安裝器、Red Hat Linux 和 Fedora 的 Anaconda 安裝器等等。

另外,Python 標準庫中包含了多個可用來調用操作系統功能的庫。例如,通過 pywin32 這個軟體包,我們能訪問 Windows 的 COM 服務以及其他 Windows API;使用 IronPython,我們能夠直接調用 .Net Framework。

通常情況下,Python 編寫的系統管理腳本,無論是可讀性,還是性能、代碼重用度以及擴展性方面,都優於普通的 shell 腳本。

3、遊戲開發

很多遊戲使用 C++ 編寫圖形顯示等高性能模塊,而使用 Python 或 Lua 編寫遊戲的邏輯。和 Python 相比,Lua 的功能更簡單,體積更小;而 Python 則支持更多的特性和數據類型。

比如說,國際上指明的遊戲 Sid Meier’s Civilization,就是使用 Python 實現的。

4、編寫伺服器軟體

Python 對於各種網路協議的支持很完善,所以經常被用於編寫伺服器軟體以及網路爬蟲。

比如說,Python 的第三方庫 Twisted,它支持非同步網路編程和多數標準的網路協議(包含客戶端和伺服器端),並且提供了多種工具,因此被廣泛用於編寫高性能的伺服器軟體。

5、科學計算

NumPy、SciPy、Matplotlib 可以讓 Python 程序員編寫科學計算程序。

以上都只是 Python 應用領域的冰山一角,總的來說,Python 語言不僅可以應用到網路編程、遊戲開發等領域,還可以在圖形圖像處理、只能機器人、爬取數據、自動化運維等多方面展露頭角,為開發者提供簡約、優雅的編程體驗。

其實python的相關工作遠不止這些,生活中的各行各業都有python的身影,所以,學Python,是明智的選擇!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/200126.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-05 14:04
下一篇 2024-12-05 14:04

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論