如何讓multithread的結果按照順序呈現?
老師您好,
在Day035的作業中,我選用Day023的作業來進行多線程的爬蟲,雖然執行成功了,但是我希望讓回傳的結果能夠按照順序呈現,請問該怎麼做才好呢? 謝謝
回答列表
-
2020/04/06 上午 03:06張維元 (WeiYuan)贊同數:2不贊同數:1留言數:1
嗨,琳芹
這是一個好問題,很高興你有發現到,主要原因是因為「Thread」本質上就會將程式一拆分多,視為不同的程式獨立各自執行。如果需要考量到順序性的話,必須要把 Thread 的結果再回傳原本的程式在進行排序。如果是使用我們介紹的 _thread 內建套件的話無法取得回傳值(程式已經被分成兩的部分各自執行)。比較好的作法就是 Function 內處理後寫入資料庫或是外部檔案。
另外有一個叫 threading 的第三方套件,可以做到取回回傳值,其作法如下:
```
from
threading
import
Thread
def
foo(bar):
print
'hello {}'.format(bar)
return
'foo'
thread
=
Thread(target=foo,
args=('world!',))
thread.start()
ret
=
thread.join()
print(ret)
```
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃
-
2020/04/08 下午 03:09Karen Wang贊同數:0不贊同數:0留言數:1
hi 老師您好:
我試著把你下面提供的程式執行,預期ret應該會是'foo', 但卻得到None, 是我理解錯誤了嗎?
-
2020/04/12 上午 02:25張維元 (WeiYuan)贊同數:1不贊同數:0留言數:2
嗨,Karen
正確寫法應該長這樣:
```
from threading import Thread
L = []
def foo(bar):
print('hello {}'.format(bar))
L.append('foo')
return
thread = Thread(target=foo, args=('world!',))
thread.start()
thread.join()
print(L)
```
還是需要一個變數去存資料,但是加了 Join 可以確保執行完畢才會往下印出。如果 少了那一行的話,有可能會先印但是 foo 還沒執行完成。
如果這個回答對你有幫助請主動點選「有幫助」的按鈕,也可以追蹤我的GITHUB帳號。若還有問題的話,也歡迎繼續再追問或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃