多线程代理更改但一次

时间:2013-04-22 10:09:52

标签: python multithreading locking tor

假设我有这样的代码:

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时,它会更改标识。 但它发生了所有7个线程发送信号以改变识别。

如何做到这一点:
如果线程收到错误28,那么它调用new_tor()而其他6个线程不会等待结果,然后才会继续工作。如何同步?

1 个答案:

答案 0 :(得分: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()