Python:多线程print的时候界面很乱
伊谢尔伦
伊谢尔伦 2017-04-17 13:31:34
[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的函数有很多。
不知道有没有更好的解决办法?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(1)
大家讲道理

其实这也就是为什么我们学并发编程的时候要多线程和互斥体一起学, 因为互斥体就是用来标志资源的使用情况, 解决线程切换时乱掉的弊端的. 其实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的做法. 希望我没有理解错你的意思.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号