在python中,定義一個方法,直接呼叫可以,但是建立一個執行緒來呼叫就可能導致失敗。這種現像多出現在使用com物件進行系統操作時,而且是以執行緒的形式呼叫。
異常提示如下:
syntax error。WMI returned a syntax error: you're probably running inside a thread without first calling pythoncom.CoInitialize[Ex] (no underlying exception)
仔細觀察的話,異常提示中已經給出了解決方案。在執行一個執行緒的時候需要呼叫pythoncom.CoInitialize()方法。鄙人在程式中使用了WMI模組,試圖獲取部分系統資訊。
異常的原因(推測)是com的機制問題。 由於COM機制允許任意兩個組件之間相互通信而不必關心是在何種計算機上的何種操作系統下運行,也不用關心組件是使用何種語言編制的,這使COM技術擁有了強大的生命力。初始化COM環境的目的是讓呼叫COM的API運作正常,也就是在COM操作之前呼叫CoInitialize或CoInitializeEX所以在執行緒函數中,如果使用com物件就必須呼叫CoInitialize或CoInitializeEX ,同時在退出時使用CoUninitialize來釋放物件。
案例:
c === send = 0.0 t += float(t.BytesReceivedPersec) / 1024 / 1024+= float(t.BytesSentPersec) / 1024 / 1024 rec, send
這段程式碼是根據電腦的網路卡取得上下行的流量(即發送流量和接收流量),直接運行是可以的。但是在tornado的RequestHandler的get或post方法中使用時,會拋出異常syntax error及相關提示。在RequestHandler中,post或get請求被認為是一個後台的執行緒方法,所以需要在實例化WMI這個com元件之前先進行com實例化。
為什麼RequestHandler中post或get請求被認為是一個後台的執行緒方法?這個問題可以從使用tornado的程式碼中窺得一二。程式碼如下:
if __name__ == '__main__': app = tornado.web.Application( handlers=[(r"/test/(\w+)", testHandler), (r'/', MainHandler)] ) server = tornado.httpserver.HTTPServer(app) server = server.listen(8848) tornado.ioloop.IOLoop.instance().start();
在為tornado設定了路由規則之後,我們開啟了httpserver的服務,最後建立一個行程來讓tornado運作起來。而每次的post或get請求則是透過路由呼叫對應的Handler,這些都是在執行緒中執行的。故案例中透過com組件WMI來取得系統流量放在get方法中就會報錯。修改後如下:
def get(self): res = {} pythoncom.CoInitialize() c = wmi.WMI() interfaces = c.Win32_PerfRawData_Tcpip_NetworkInterface() print len(interfaces) rec = send = 0.0 for t in interfaces: print t.Name rec += float(t.BytesReceivedPersec) / 1024 / 1024 send += float(t.BytesSentPersec) / 1024 / 1024 print rec, send res["receive"] = "%.2f" % rec res["send"] = "%.2f" % send self._write_json(res)
模組中很有很多類型(類型也有很多屬性),在具體使用的過程中查詢起來很痛苦。案例中的統計流量用的是Win32_PerfRawData_Tcpip_NetworkInterface ,也有解決方案用的是Win32_PerfRawData_Tcpip_TCPv4 兩個統計到的資料差異很大,請根據實際情況來選擇。
以上是關於python方法無法在執行緒中使用的解決辦法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版
視覺化網頁開發工具