簡體   English   中英

Python-IO的多處理和線程

[英]Python - Multiprocessing and Threads for IO

您好,我正在嘗試拿一個使用線程的非異步代碼並將其轉換為同時使用兩者的示例。

我的目標:產生4個進程,並且每個進程同時產生10個線程。

import requests
import multiprocessing
from concurrent import futures


def poll_data_1(data):
    response = requests.get('https://breadcrumbscollector.tech/feed/')
    print(f'Got data of length: {len(response.content)} in just {response.elapsed}')


def thread_set(data):
    max_workers = 10
    concurrent = futures.ThreadPoolExecutor(max_workers)
    with concurrent as ex:
        ex.map(poll_data_1, data)


data =range(40)
data1 =[]
for l in data:
    data1.append([l])

# Mutliprocessing
with multiprocessing.Pool(processes=4, maxtasksperchild=1) as pool:
    pool.imap_unordered(thread_set, data1)     
    pool.close()
    pool.join()

因此,此代碼“有效”,但看起來它一次只打開一個進程。 因此,將運行10個線程,而不是10個。 我的目標是一次運行所有40個線程。

我嘗試執行此操作的原因是我的實際應用程序正在嘗試執行8,000-14,000個IO綁定請求。 因此線程化沒有那么高的規模。 如果可以說我的真實服務器對CPU開放了進程,並且每個進程都產生1000個線程,那么我認為它會更好。

還是我超級錯...謝謝!

您需要一個循環來阻止主線程關閉池,直到所有作業完成。

更換

pool.imap_unordered(thread_set, data1)

for result in pool.imap_unordered(thread_set, data1):
    pass

然后再次運行您的示例。

您也不需要:

pool.close()
pool.join()

因為with語句會自動執行此操作。

暫無
暫無

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

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