簡體   English   中英

使用隊列在python中進行多線程

[英]Multithreading in python using queue

我對Python很陌生,我需要在代碼中實現多線程。

我有一個巨大的.csv文件(百萬行)作為輸入。 我讀了這一行,對每一行進行了休息請求,對每一行進行了一些處理,然后將輸出寫入另一個文件。 輸入/輸出文件中的行順序確實很重要。 現在,我正在逐行執行此操作。 我想運行相同的代碼,但要並行運行,即從.csv文件讀取20行輸入,並並行進行其余調用,以便我的程序更快。

我一直在閱讀http://docs.python.org/2/library/queue.html ,但是我讀到有關python GIL的問題,該問題說即使在多線程之后,代碼也不會運行得更快。 還有其他簡便方法可以實現多線程嗎?

您可以將.csv文件分成多個較小的文件嗎? 如果可以,則可以讓另一個程序運行處理器的多個版本。

假設文件都被命名為file1file2等,並且您的處理器將文件名作為參數。 你可以有:

import subprocess
import os
import signal

for i in range(1,numfiles):
    program = subprocess.Popen(['python'], "processer.py", "file" + str(i))
    pid = program.pid

    #if you need to kill the process:
    os.kill(pid, signal.SIGINT)

Python在IO上發布GIL。 如果大部分時間都花在休息請求上; 您可以使用線程來加快處理速度:

try:
    from gevent.pool import Pool # $ pip install gevent
    import gevent.monkey; gevent.monkey.patch_all() # patch stdlib
except ImportError: # fallback on using threads
    from multiprocessing.dummy import Pool

import urllib2    

def process_line(url):
    try:
        return urllib2.urlopen(url).read(), None
    except EnvironmentError as e:
        return None, e

with open('input.csv', 'rb') as file, open('output.txt', 'wb') as outfile:
    pool = Pool(20) # use 20 concurrent connections
    for result, error in pool.imap_unordered(process_line, file):
        if error is None:
            outfile.write(result)

如果輸入/輸出順序應該相同; 您可以使用imap代替imap_unordered

如果您的程序是CPU綁定的; 您可以使用multiprocessing.Pool()來創建多個進程。

另請參見Python解釋器阻止多線程DNS請求?

該答案顯示了如何使用線程+隊列模塊手動創建線程池

暫無
暫無

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

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