微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么使用线程和进程的结果不同?

如何解决为什么使用线程和进程的结果不同?

在实践python的线程和进程的时候,发现在处理一些函数的时候,线程和进程的打印结果会不一样。我不是很明白原因,所以我把代码和打印结果一起发送了。以及如何让进程部分和线程部分的结果相同?

使用线程的时候就没事了:

import os,time,random,threading,multiprocessing

list = ['python','django','tornado','flask','bs5','requests','uvloop']

new_lists = []

def work():
    if len(list) == 0:
        return
    data = random.choice(list)
    list.remove(data)
    new_data = '%s_new' % data
    new_lists.append(new_data)
    time.sleep(1)

if __name__ == '__main__':
    start = time.time()
    print('old list lenc is %s' % len(list))

    for i in range(len(list)):
        t = threading.Thread(target=work)
        t.start()
    t.join()

    print('old list:',list)
    print('new list',new_lists,len(new_lists))
    print('time is %s' % (time.time() - start))

哪个会打印:(结果很好)

old list lenc is 7
old list: []
new list ['uvloop_new','python_new','bs5_new','tornado_new','django_new','requests_new','flask_new'] 7
time is 1.0153822898864746

但是,当将线程更改为进程时,发生了错误

import os,'uvloop']

new_lists = []


def work():
    if len(list) == 0:
        return
    data = random.choice(list)
    list.remove(data)
    new_data = '%s_new' % data
    new_lists.append(new_data)
    time.sleep(1)


if __name__ == '__main__':
    start = time.time()
    print('old list lenc is %s' % len(list))

    for i in range(len(list)):
        t = multiprocessing.Process(target=work)
        t.start()
    t.join()

    print('old list:',len(new_lists))
    print('time is %s' % (time.time() - start))

哪个会打印:(结果不符合预期)

old list lenc is 7
old list: ['python','uvloop']
new list [] 0
time is 1.4266910552978516

解决方法

在多线程中你有共享内存,但在多进程中你没有共享内存。因此,当您尝试在每个进程中更改全局变量时,您会错过数据。 这个问题没有办法这样解决,你应该根据你的项目情况选择正确的选项。如果您需要在每个并行函数中操作共享数据,您应该使用线程。 尽管您可以使用 Queue 在多处理中的每个进程之间传递数据。 https://docs.python.org/3/library/queue.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。