[英]Multithreading in python using queue
我對Python很陌生,我需要在代碼中實現多線程。
我有一個巨大的.csv文件(百萬行)作為輸入。 我讀了這一行,對每一行進行了休息請求,對每一行進行了一些處理,然后將輸出寫入另一個文件。 輸入/輸出文件中的行順序確實很重要。 現在,我正在逐行執行此操作。 我想運行相同的代碼,但要並行運行,即從.csv文件讀取20行輸入,並並行進行其余調用,以便我的程序更快。
我一直在閱讀http://docs.python.org/2/library/queue.html ,但是我讀到有關python GIL的問題,該問題說即使在多線程之后,代碼也不會運行得更快。 還有其他簡便方法可以實現多線程嗎?
您可以將.csv文件分成多個較小的文件嗎? 如果可以,則可以讓另一個程序運行處理器的多個版本。
假設文件都被命名為file1 , file2等,並且您的處理器將文件名作為參數。 你可以有:
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()
來創建多個進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.