如何解决为什么使用线程和进程的结果不同?
在实践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 举报,一经查实,本站将立刻删除。