python多線程返回值
㈠ python中的多線程為什麼會報錯
題主你好,
你的問題在於threading模式的Thread()類使用的不正確,你代碼中的代碼為:
t1 = threading.Thread(target=name_b, name="job2")
其中name_b是你定義的函數名, 其實光看語句本身是沒錯的,但問題出在:
" name_b這個函數定義中有兩個參數,你沒有在Thread()類中給name_b傳參 "
你想一下,如果不考慮多線程,你去調用name_b這個函數,光寫個:
name_b() 肯定是不對的
你要將os_name2和url_b這兩個參數也帶上才行,即:
name_b(xxx, yyy)
所以就你當前代碼報錯信息要改的話, 只需要在兩個threading.Thread()中再加一個args參數,將傳給函數的參數代碼寫在" () "中, 即:
threading.Thread(target=name_b, name="job2", args=(xxx, yyy))
另一個threading.Thread()你照著上面的寫即可.
希望可以幫到題主, 歡迎追問
㈡ python的線程如何返回值
在python里線程是不受控的。 java里也是有限受控。 windows里線程本來就不受控。只有進程可以控制。 所以線程啟動後要通過變數來取到返回值。
不過考慮到訪問沖突問題,通常通過事情消息機制,以及queue的方式,把數據傳遞出來。
象wode5130的這種方式。也可以考慮。不過建議試驗後再明確。
python里的線程實際上是微線程。也就是說,它與主進程是由python解釋器通過輪洵執行的。 但是這個微線程同時又是標準的windows線程。這就涉及到python中的GIL,一個全局執行鎖的問題。
所以用global s這種方式是行得通的,因為它們都在同一個變數空間內。
如果有多個線程就不成了。 多個線程都給S賦值。會造成賦值間隙中的空白。不知道是為什麼,不過的確有時候,取不到正確的值。
㈢ python的Threading怎麼返回值
1、常見的有寫一個自己的多線程類,寫一個方法返回。
2、可以設置一個全局的隊列返回值。
3、也可以用multiprocessing.pool.ThreadPool 。
㈣ python 多進程和多線程配合
由於python的多線程中存在PIL鎖,因此python的多線程不能利用多核,那麼,由於現在的計算機是多核的,就不能充分利用計算機的多核資源。但是python中的多進程是可以跑在不同的cpu上的。因此,嘗試了多進程+多線程的方式,來做一個任務。比如:從中科大的鏡像源中下載多個rpm包。
#!/usr/bin/pythonimport reimport commandsimport timeimport multiprocessingimport threadingdef download_image(url):
print '*****the %s rpm begin to download *******' % url
commands.getoutput('wget %s' % url)def get_rpm_url_list(url):
commands.getoutput('wget %s' % url)
rpm_info_str = open('index.html').read()
regu_mate = '(?<=<a href=")(.*?)(?=">)'
rpm_list = re.findall(regu_mate, rpm_info_str)
rpm_url_list = [url + rpm_name for rpm_name in rpm_list] print 'the count of rpm list is: ', len(rpm_url_list) return rpm_url_
def multi_thread(rpm_url_list):
threads = [] # url = 'https://mirrors.ustc.e.cn/centos/7/os/x86_64/Packages/'
# rpm_url_list = get_rpm_url_list(url)
for index in range(len(rpm_url_list)): print 'rpm_url is:', rpm_url_list[index]
one_thread = threading.Thread(target=download_image, args=(rpm_url_list[index],))
threads.append(one_thread)
thread_num = 5 # set threading pool, you have put 4 threads in it
while 1:
count = min(thread_num, len(threads)) print '**********count*********', count ###25,25,...6707%25
res = [] for index in range(count):
x = threads.pop()
res.append(x) for thread_index in res:
thread_index.start() for j in res:
j.join() if not threads:
def multi_process(rpm_url_list):
# process num at the same time is 4
process = []
rpm_url_group_0 = []
rpm_url_group_1 = []
rpm_url_group_2 = []
rpm_url_group_3 = [] for index in range(len(rpm_url_list)): if index % 4 == 0:
rpm_url_group_0.append(rpm_url_list[index]) elif index % 4 == 1:
rpm_url_group_1.append(rpm_url_list[index]) elif index % 4 == 2:
rpm_url_group_2.append(rpm_url_list[index]) elif index % 4 == 3:
rpm_url_group_3.append(rpm_url_list[index])
rpm_url_groups = [rpm_url_group_0, rpm_url_group_1, rpm_url_group_2, rpm_url_group_3] for each_rpm_group in rpm_url_groups:
each_process = multiprocessing.Process(target = multi_thread, args = (each_rpm_group,))
process.append(each_process) for one_process in process:
one_process.start() for one_process in process:
one_process.join()# for each_url in rpm_url_list:# print '*****the %s rpm begin to download *******' %each_url## commands.getoutput('wget %s' %each_url)
def main():
url = 'https://mirrors.ustc.e.cn/centos/7/os/x86_64/Packages/'
url_paas = 'http://mirrors.ustc.e.cn/centos/7.3.1611/paas/x86_64/openshift-origin/'
url_paas2 ='http://mirrors.ustc.e.cn/fedora/development/26/Server/x86_64/os/Packages/u/'
start_time = time.time()
rpm_list = get_rpm_url_list(url_paas) print multi_process(rpm_list) # print multi_thread(rpm_list)
#print multi_process()
# print multi_thread(rpm_list)
# for index in range(len(rpm_list)):
# print 'rpm_url is:', rpm_list[index]
end_time = time.time() print 'the download time is:', end_time - start_timeprint main()123456789101112131415161718
代碼的功能主要是這樣的:
main()方法中調用get_rpm_url_list(base_url)方法,獲取要下載的每個rpm包的具體的url地址。其中base_url即中科大基礎的鏡像源的地址,比如:http://mirrors.ustc.e.cn/centos/7.3.1611/paas/x86_64/openshift-origin/,這個地址下有幾十個rpm包,get_rpm_url_list方法將每個rpm包的url地址拼出來並返回。
multi_process(rpm_url_list)啟動多進程方法,在該方法中,會調用多線程方法。該方法啟動4個多進程,將上面方法得到的rpm包的url地址進行分組,分成4組,然後每一個組中的rpm包再最後由不同的線程去執行。從而達到了多進程+多線程的配合使用。
代碼還有需要改進的地方,比如多進程啟動的進程個數和rpm包的url地址分組是硬編碼,這個還需要改進,畢竟,不同的機器,適合同時啟動的進程個數是不同的。
㈤ python 怎麼實現多線程的
線程也就是輕量級的進程,多線程允許一次執行多個線程,Python是多線程語言,它有一個多線程包,GIL也就是全局解釋器鎖,以確保一次執行單個線程,一個線程保存GIL並在將其傳遞給下一個線程之前執行一些操作,也就產生了並行執行的錯覺。
㈥ Python3多進程運行返回值怎麼獲得
frommultiprocessingimportPool
importtime
defwork(n):
print('開工啦...')
time.sleep(3)
returnn**2
if__name__=='__main__':
q=Pool()
#非同步apply_async用法:如果使用非同步提交的任務,主進程需要使用jion,等待進程池內任務都處理完,然後可以用get收集結果,否則,主進程結束,進程池可能還沒來得及執行,也就跟著一起結束了
res=q.apply_async(work,args=(2,))
q.close()
q.join()#join在close之後調用
print(res.get())
#同步apply用法:主進程一直等apply提交的任務結束後才繼續執行後續代碼
#res=q.apply(work,args=(2,))
#print(res)
㈦ python的Threading怎麼返回值
1、常見的有寫一個自己的多線程類,寫一個方法返回。 2、可以設置一個全局的隊列返回值。 3、也可以用multiprocessing.pool.ThreadPool 。
㈧ python執行多進程時,如何獲取函數返回的值
共享變數的方法。
㈨ python threading模塊,生成多線程之後,怎麼得到線程執行完成後return出的字元串呢
多線程/多進程都是通訊或者回調,而不是直接返回結果。這個很容易理解的,因為如果你用返回結果來給一個變數賦值,你就必須等待這個函數結束,你這個程序就阻塞了,這就失去了多線程/多進程防止阻塞的意義了。
通訊可以是事件驅動或者用線程安全的數據結構來傳遞數據(比如Queue,也可以是消息隊列0mq,rabbitMQ之類),回調就是你一個程序執行完成後調用另外一個函數來處理接下來怎麼做。
㈩ Python多線程是什麼意思
多線程能讓你像運行一個獨立的程序一樣運行一段長代碼。這有點像調用子進程(subprocess),不過區別是你調用shu的是一個函數或者一個類,而不是獨立的程序。
程基本上是一個獨立執行流程。單個進程可以由多個線程組成。程序中的每個線程都執行特定的任務。例如,當你在電腦上玩游戲時,比如說國際足聯,整個游戲是一個單一的過程。,但它由幾個線程組成,負責播放音樂、接收用戶的輸入、同步運行對手等。所有這些都是單獨的線程,負責在同一個程序中執行這些不同的任務。
每個進程都有一個始終在運行的線程。這是主線。這個主線程實際上創建子線程對象。子線程也由主線程啟動。