簡體   English   中英

用於返回值以存儲在一個列表中的不同功能的Python多線程

[英]Python multithreading for different functions that return values to store in one list

我使用腳本對某些站點進行批處理並從中獲取新聞。 該腳本中的每個函數都解析一個站點並返回文章列表,然后我希望將它們全部合並到一個大列表中。 如果我逐站點削減成本,則需要花費很長時間,因此我決定使用多線程。 我在底部找到了一個像這樣的樣本,但對我來說似乎並不算什么。 如果我要添加一個功能來解析一個站點,則每次都需要添加相同的代碼塊:

qN = Queue()
Thread(target=wrapper, args=(last_news_from_bar, qN)).start()
news_from_N = qN.get()
for new in news_from_N:
    news.append(new)

還有其他解決方案來做這種事情嗎?

#!/usr/bin/python
# -*- coding: utf-8 -*-
from queue import Queue
from threading import Thread


def wrapper(func, queue):
    queue.put(func())


def last_news_from_bar():
    ...
    return list_of_articles #[['title1', 'http://someurl1', '2017-09-13'],['title2', 'http://someurl2', '2017-09-13']]


def last_news_from_foo():
    ...
    return list_of_articles


q1, q2 = Queue(), Queue()

Thread(target=wrapper, args=(last_news_from_bar, q1)).start()
Thread(target=wrapper, args=(last_news_from_foo, q2)).start()

news_from_bar = q1.get()
news_from_foo = q2.get()

all_news = []

for new in news_from_bar:
    news.append(new)
for new in news_from_foo:
    news.append(new)

print(all_news)

您應該做的全部工作是使用單個隊列並擴展結果數組:

q1 = Queue()

Thread(target=wrapper, args=(last_news_from_bar, q1)).start()
Thread(target=wrapper, args=(last_news_from_foo, q1)).start()

all_news = []

all_news.extend(q1.get())
all_news.extend(q1.get())

print(all_news)

沒有Queue解決方案:

NEWS = []
LOCK = Lock()

def gather_news(url):
    while True:
        news = news_from(url)
        if not news: break
        with LOCK:
            NEWS.append(news)

if __name__ == '__main__':
    T = []
     for url in ['url1', 'url2', 'url3']:
        t = Thread(target=gather_news, args=(url,))
        t.start()
        T.append(t)

# Wait until all Threads done
for t in T: 
    t.join()

print(NEWS)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM