logo
Loading...

如何讓multithread的結果按照順序呈現? - Cupoy

老師您好,在Day035的作業中,我選用Day023的作業來進行多線程的爬蟲,雖然執行成功了,但是我...

multithread

如何讓multithread的結果按照順序呈現?

2020/04/05 上午 11:18
Python網路爬蟲討論版
黃琳芹
觀看數:37
回答數:3
收藏數:4
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:09
    Karen 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 😃😃😃