2014-12-15 26 views
7

Sonsuz döngü işlevi yapmak istiyorum.Sonsuz döngü işlevini yapmak için iş parçacığı havuzu nasıl kullanılır?

İşte kullanılması while True bunu yaparken, biraz yavaş, bu yüzden aynı anda işlevini do_request() yürütmek için bir iş parçacığı havuzu kullanmak isteyen benim kod

def do_request(): 
    # my code here 
    print(result) 

while True: 
    do_request() 

olduğunu. Bu nasıl yapılır ?

HTTP sunucusunu test etmek için ab (Apache Bench) gibi kullanın.

+0

'concurrent.features' öğesini kullanarak? –

+0

Teşekkür ederiz @BhargavRao, daha sonra dokümanı inceleyeceğim. –

+1

Soruya cevap yazmayın. Yararlı bir cevap aldıysanız kabul edin. Başka bir sorunuz varsa, ayrı olarak sorun. – jonrsharpe

cevap

0

Son olarak, bu sorunu çözdük. İplik numarasını sınırlamak için bir değişken kullanıyorum.

İşte son kodum, sorunumu çözdü.

import threading 
import time 

thread_num = 0 
lock = threading.Lock() 

def do_request(): 
    global thread_num 
    # ------------- 
    # my code here 
    # ------------- 
    with lock: 
     thread_num -= 1 

while True: 
    if thread_num <= 50: 
     with lock: 
      thread_num += 1 
     t = threading.Thread(target=do_request) 
     t.start() 
    else: 
     time.sleep(0.01) 

Tüm yanıtlar için teşekkürler.

+0

'Lock' nerede tanımlandı? Ayrıca, "lock.acquire" ve "lock.release" sözcüklerini elle çağırmak yerine, "with" bloğunu kullanabilirsiniz: lock ile: thread_num + = 1 ' – Kroltan

+0

Üzgünüm, unuttum. Ekle. Kod daha iyi, teşekkürler. –

+0

Sorun değil, sadece bu geleceğin kanıtı. :) – Kroltan

0

Bunu uygulamak için Python'da threading'u kullanabilirsiniz. Eğer çok fazla, bu nedenle sistem bunu işleyebilir alamadım emin olun (ihtiyaç olarak Temel olarak, birçok konuları başlatmak

import threading 

# define threads 
task1 = threading.Thread(target = do_request) 
task2 = threading.Thread(target = do_request) 

# start both threads 
task1.start() 
task2.start() 

# wait for threads to complete 
task1.join() 
task2.join() 

: (iki ekstra konuları yalnızca kullanılırken) buna benzer bir şey olabilir), daha sonra görevleri tamamlamak için beklemek için .join().

Ya da multiprocessing Python modülü ile meraklısı alabilirsiniz.

+0

Teşekkürler. Ama bu mükemmel değil. Çok fazla tekrarlama kodu, eğer iş parçacıklarından biri yavaşlarsa, tüm döngü onu bekler. Bu yüzden iplik havuzunu kullanmanın daha iyi olduğunu düşünüyorum. Çok işlem veya eşzamanlılıkları deneyeceğim. –

+1

Bu sadece bir örnekti. Kodun tekrarlanmasını önlemek için tüm iş parçacığı tutamaçlarını döngü/diziye koymakta özgürsünüz, bu size kalmış. Ayrıca, bir iş parçacığı yavaşsa, geri kalanı yine de çalışır. Hepsini eşzamanlı olarak başlattıysanız bir iş parçacığı döngüyü yavaşlatmaz. En yavaş iplik bittiğinde döngüsünüz tamamlanacak, elbette. – nochkin

+0

"En yavaş iş parçacığı yapıldığında döngü tamamlanacak, tabi ki." tam olarak abcfy'nin iddia ettiği şey budur ve bunu oldukça kötü bir çözüm haline getirir (bir istek zaman aşımına uğradı - aniden birkaç saniye için hiçbir şey yapmazsınız!). Yeni bir eşzamanlı sınıfa sahip olmayan eski sürümler için de "çoklu işlemlerde" bir threadpool sınıfı var. – Voo

0

aşağıdaki kodu deneyin:

import multiprocessing as mp 
import time 

def do_request(): 
    while(True): 
     print('I\'m making requests') 
     time.sleep(0.5) 


p = mp.Process(target=do_request) 
p.start() 

for ii in range(10): 
    print 'I\'m also doing other things though' 
    time.sleep(0.7) 

print 'Now it is time to kill the service thread' 
p.terminate() 

ana iş parçacığı yıldızlı isteği yapar ve gereken kadar gider bir servis iplik ve daha sonra servis parçacığı kadar bitirir. Bu nasıl hakkında

+0

Teşekkürler. Ama yanlış anladın. Eşzamanlı olarak "do_request()" yi çalıştırmak istiyorum çünkü biraz yavaş. Aynen http sunucusunu test etmek için ab (apache bench) gibi. –

+0

Üzgünüm, benim anlayışım, bir servis ipliği gerektiğidir. Bu tür bir şeye ihtiyaç duyan birinin arama motorları aracılığıyla sorunuza ulaşması durumunda cevabı burada bırakacağım. –

0

Belki concurrent.futures.ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor 
import time 

def wait_on_b(hello): 
    time.sleep(1) 
    print(hello) # b will never complete because it is waiting on a. 
    return 5 

def wait_on_a(): 
    time.sleep(1) 
    print(a.result()) # a will never complete because it is waiting on b. 
    return 6 


executor = ThreadPoolExecutor(max_workers=2) 
a = executor.submit(wait_on_b, 3) 
b = executor.submit(wait_on_a) 
+0

Teşekkürler, sorumu düzenledim. –

0

kullanabilir?

from threading import Thread, Event 

class WorkerThread(Thread): 
    def __init__(self, logger, func): 
      Thread.__init__(self) 
      self.stop_event = Event() 
      self.logger = logger 
      self.func = func 

    def run(self): 
      self.logger("Going to start the infinite loop...") 
      #Your code 
      self.func() 

concur_task = WorkerThread(logger, func = do_request) 
concur_task.start() 

Konuyu bitirmek için ...

concur_task.stop_event.set() 
concur_task.join(10) #or any value you like 
+0

Teşekkür ederim. İş parçacığı sayısını sınırlamak için global bir değişken kullanıyorum ve sorunumu çözdüm. Mesajımı görebilirsin. –

İlgili konular