首页 > Python:多线程print的时候界面很乱

Python:多线程print的时候界面很乱

在多线程中调用同一个函数print数据的时候,界面很乱
代码如下:

def test(url):
    print url
pool = ThreadPool(10)
for url in self.urls:
    pool.add_job(test,url)
pool.wait(numtasks=10)

如图所示


如果需要在test函数中使用临界区,那岂不是很麻烦吗?
如下虽然使用锁机制来解决了:

self.mutex = threading.Lock()
....
def test(url):
    time.sleep(1)
    self.mutex.acquire()
    print url
    self.mutex.release()

pool = ThreadPool(10)
for url in self.urls:
    pool.add_job(test,url)
pool.wait(numtasks=10)

毕竟,在项目中类似test的函数有很多。
不知道有没有更好的解决办法?


其实这也就是为什么我们学并发编程的时候要多线程和互斥体一起学, 因为互斥体就是用来标志资源的使用情况, 解决线程切换时乱掉的弊端的. 其实mutex不算繁复. 如果你希望能更自动话一点, 我建议你可以给你那些函数都加一个decorator.
比如把你上面的代码改成装饰器的形式就变成这样:

self.mutex = threading.Lock()
....
def add_mutex(func):
    def decor(*args, **kwargs):
        time.sleep(1)
        self.mutex.acquire()
        func(*args, **kwargs)
        self.mutex.release()
    return decor

@add_mutex
def test(url):
    print url

pool = ThreadPool(10)
for url in self.urls:
    pool.add_job(test,url)
pool.wait(numtasks=10)

这是一个挺pythonic的做法. 希望我没有理解错你的意思.

【热门文章】
【热门文章】