玩蛇网提供最新Python编程技术信息以及Python资源下载!
您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容

Python多线程输出格式粘连怎么处理

在多线程中调用同一个函数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的做法. 希望我没有理解错你的意思.

玩蛇网文章,转载请注明出处和文章网址:http://www.iplaypy.com/wenda/wd19399.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月19日 - 11时07分53秒 发布自玩蛇网

我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules