0

次のようなコードがあるとします。

def func1(a,b,c):
    try:
        p = pycurl.Curl()

        p.setopt(pycurl.PROXY, "127.0.0.1")
        p.setopt(pycurl.PROXYPORT, 9050)
        p.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)

        p.perform()
        p.close()

    except pycurl.error as error:
        if error[0] == 28:   # timeout - change proxy
            print "Tor timeout, need to change"
            queue.put((a,b,c))
            new_tor()
            return

def new_tor():
    # send_signal_for_new_ident_is_here

このコードを 7 つのスレッドで開始します。
スレッドがエラー 28 を受け取ると、ID が変更されます。しかし、識別を変更するためにすべての 7 つのスレッドがシグナルを送信することが起こります。

これを行う方法:
スレッドがエラー 28 を受け取った場合、スレッドは new_tor() を呼び出し、他の 6 つのスレッドは結果を待つだけでなく、それから作業を続行します。これを同期する方法は?

4

1 に答える 1

0

エラー「id」をキューに入れるだけで、エラーが発生した場合は値をキューに戻し、必要に応じて処理します。

あなたはスレッドを終了したくありません。それは私がしたことです。
そのため、スレッドごとに一意の識別子を設定できます。これにより、スレッドでエラーが発生した場合、以前にこのエラーが発生したことを示すデータ (識別子) も追加され、すべてのスレッドでこのエラーが発生した場合、エラーはキューから削除されます。

コード:

import threading
import Queue
y = 0
def f1():
    global y
    y += 1
    if y > 100:
        raise ValueError('trial')
def f2():
    return

class Test(threading.Thread):
    def __init__(self, func, name):
        threading.Thread.__init__(self)
        self.func = func
        self.name = name
    def run(self):
        while True:
            x = ''
            if not queue.empty():
                x = queue.get()
                if x == 'error':
                    queue.put(x)
                    print 'Stopping %s' % (self.name,)
                    return
            try:
                self.func()
            except Exception as e:
                queue.put('error')

queue = Queue.Queue()
thread1 = Test(f1, '1')
thread2 = Test(f2, '2')

thread1.start()
thread2.start()
于 2013-04-22T10:51:33.353 に答える